Quiero una función como GetCurrentThread que devuelve un objeto TThread del hilo de ejecución actual. Sé que hay una API de Win32 llamada GetCurrentThread, pero devuelve el ID de la cadena. Si existe la posibilidad de obtener TThread objeto de esa ID también está bien.¿Obtiene el objeto TThread para el subproceso que se está ejecutando actualmente?
Respuesta
La última versión de Delphi, Delphi 2009, tiene una propiedad de clase CurrentThread en la clase TThread.
Esto devolverá el objeto de subproceso adecuado de Delphi si es un subproceso nativo. Si el subproceso es un subproceso "ajeno", es decir, creado utilizando algún otro mecanismo o en una devolución de llamada de un subproceso de terceros, entonces creará un subproceso de envoltura alrededor del manejador de subproceso.
Respondiendo a mi propia pregunta. Supongo que no es posible obtener TThread objeto de ID. Es posible mediante el uso de una variable global. Luego, al comparar su identificador de identificador y el identificador de subproceso actual, uno puede determinar si se está ejecutando en el subproceso principal o no.
Delphi 2009, al menos, tiene una propiedad TThread.CurrentThread. –
¿No sería el hilo de ejecución actual del que está intentando ejecutar una función?
podría almacenar el puntero de la instancia TThread en el contexto del subproceso actual a través del TlsSetValue llamada API y luego recuperarlo utilizando TlsGetValue. Sin embargo, tenga en cuenta que esto solo funcionará si está tratando de recuperar/almacenar la instancia TThread del actual subproceso.
Utilizando su propia respuesta, parece tal vez sólo desea "determinar si se ejecuta en el hilo principal o no", en cuyo caso sólo se puede utilizar
if Windows.GetCurrentThreadId() = System.MainThreadID then
// ...
Aunque esto no funcionará a partir de una DLL creado con Delphi si fue cargado por un hilo de trabajo.
Estoy usando mi propio descendiente TThread que se registra en una lista global, protegido con un candado.
De esta manera, un método en este descendiente puede recorrer la lista y obtener un TThread dar una identificación.
- 1. Obtenga el nombre del método que se está ejecutando actualmente
- 2. ¿Cómo obtengo el HMODULE para el código que se está ejecutando actualmente?
- 3. ¿Obtener instancia de la actividad que se está ejecutando actualmente?
- 4. ¿Cómo puede encontrar el número de procesador en el que se está ejecutando un subproceso?
- 5. Buscar ruta al archivo que se está ejecutando actualmente
- 6. ¿Se está ejecutando un subproceso en iOS?
- 7. ¿Cómo obtengo el directorio en el que se encuentra el archivo jar que se está ejecutando actualmente?
- 8. Determinando el caso de prueba que se está ejecutando actualmente por Nunit
- 9. ¿Cómo obtener el nombre de la prueba que se está ejecutando actualmente en spock?
- 10. Obtener el nombre del esquema del procedimiento almacenado que se está ejecutando actualmente
- 11. Mostrar el nombre de la función que se está ejecutando actualmente
- 12. Cómo determinar si una aplicación web se está ejecutando actualmente
- 13. Capture el sonido que se está reproduciendo actualmente
- 14. cómo ver qué código javascript se está ejecutando actualmente?
- 15. Ruby: obtener el archivo que se está ejecutando
- 16. ¿Cómo encuentro la CPU en la que se está ejecutando el subproceso actual, para Mac y BSD?
- 17. Obtener el nombre del método actual que se está ejecutando
- 18. apropiante un hilo que se está ejecutando sincronizado método
- 19. ¿Obtiene la línea de código y el archivo que está ejecutando la función actual en PHP?
- 20. Obtiene el elemento/objeto donde se coloca el elemento
- 21. ¿Cómo obtener la ubicación de la DLL que se está ejecutando actualmente?
- 22. Cómo obtener la ruta de acceso del código javascript que se está ejecutando actualmente
- 23. Comprobar si el proceso se está ejecutando
- 24. Finalmente el bloque no se está ejecutando?
- 25. ¿Se está ejecutando el hilo Java en qué procesador?
- 26. Error Se ha descargado el dominio de aplicación en el que se estaba ejecutando el subproceso. Cuando
- 27. ¿Está seguro el subproceso RNGCryptoServiceProvider.GetBytes?
- 28. Cómo eliminar el objeto de subproceso de subproceso cuando termina el subproceso?
- 29. iPhone SDK- Error del depurador: El programa que se está depurando no se está ejecutando
- 30. Compruebe si un subproceso de Win32 se está ejecutando o está en estado suspendido
Desafortunadamente, CurrentThread tiene un defecto grave que lo hace inútil: http://stackoverflow.com/questions/188281/delphi-tthread- currentthread-and-eaccessviolation-is-this-a-bug-or-my-incompete – Roddy
@Roddy y para los lectores en el futuro: eso se solucionó con un parche en 2009 y se corrigió en el lanzamiento de 2010. –
@DavidM - Gracias, sí, corregido en D2010. D2009 requiere el parche (no oficial) vinculado a la otra pregunta; ninguna de las actualizaciones oficiales de D2009 resuelve este problema. – Roddy