2008-09-30 15 views

Respuesta

19

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.

+0

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

+4

@Roddy y para los lectores en el futuro: eso se solucionó con un parche en 2009 y se corrigió en el lanzamiento de 2010. –

+1

@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

0

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.

+0

Delphi 2009, al menos, tiene una propiedad TThread.CurrentThread. –

0

¿No sería el hilo de ejecución actual del que está intentando ejecutar una función?

0

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.

19

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.

4

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.

Cuestiones relacionadas