2010-10-05 5 views
6

Cuando crea un descendiente TThread utilizando la paleta de herramientas en su BDS, puede proporcionar un nombre para el hilo. Aquí está el código generado automáticamente. Que acaba de llamar a la función SetName() en el método de ejecución y el hilo de llamar a este método se le da un nombre en una especie de manera extraña ...Hilos con nombre en Delphi: ¿para qué sirve?

{$IFDEF MSWINDOWS} 
type 
    TThreadNameInfo = record 
    FType: LongWord;  // must be 0x1000 
    FName: PChar;  // pointer to name (in user address space) 
    FThreadID: LongWord; // thread ID (-1 indicates caller thread) 
    FFlags: LongWord; // reserved for future use, must be zero 
    end; 
{$ENDIF} 

{ TTestThread } 

procedure TTestThread.SetName; 
{$IFDEF MSWINDOWS} 
var 
    ThreadNameInfo: TThreadNameInfo; 
{$ENDIF} 
begin 
{$IFDEF MSWINDOWS} 
    ThreadNameInfo.FType := $1000; 
    ThreadNameInfo.FName := 'ThreadName'; 
    ThreadNameInfo.FThreadID := $FFFFFFFF; 
    ThreadNameInfo.FFlags := 0; 

    try 
    RaiseException($406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo); 
    except 
    end; 
{$ENDIF} 
end; 

Me resulta muy útil durante la depuración para que usted no puede ver solo TID, pero también nombres de subprocesos asignados de esa manera. Sabes qué hilo es el que gracias a eso.

Dígame, sin embargo, si se puede acceder al nombre asignado de alguna manera. ¿Se puede leer según el manejo de un hilo? ¿O puede ser leído incluso desde 'afuera' del proceso por otro proceso? Ya sabes, hay aplicaciones que enumeran tus procesos y los hilos que trabajan en ellos. ¿Este nombre será accesible para aplicaciones como esa?

Gracias!

+0

Para cualquiera que esté buscando cómo configurar el nombre del hilo MIENTRAS que en el depurador, este docwiki El tema debería ayudar: Manualmente: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Naming_a_Thread_While_Debugging En el código: http://docwiki.embarcadero.com/Libraries/Seattle/en/System.Classes.TThread.NameThreadForDebugging –

Respuesta

9

En realidad, los nombres de subprocesos solo se utilizan con fines de depuración y nada más, realmente. En su código, puede identificar los hilos utilizando el ThreadID. Y si desea mantener un nombre con esos identificadores de subprocesos, mantenga una lista separada (diccionario) que asigne cada Id. De subproceso al nombre que desee.
El truco que ves hace un truco desagradable. La excepción que se genera es capturada por el depurador, que solo lo maneja como una excepción especial y solo continuará la ejecución. El indicador de excepción solo le dice al sistema que continúe después de que se haya lanzado la excepción, ya que el código lo manejará. La cláusula except vacía está manejando la excepción dentro de tu código. Es solo un sucio truco para comunicarse con el depurador, que verá la excepción y recordará el nombre que acaba de pasar ...

+0

Gracias por una explicación clara. Entonces, ¿hay otra manera de asignar un nombre a un hilo para que pueda verlo desde afuera? Supongo que no, pero solo quiero asegurarme :). Gracias –

+0

En realidad, los hilos no tienen nombre. Pero para asignarles un nombre, use una matriz dinámica con dos valores por elemento: uno para ID, y otro para el nombre. En .NET, hay una clase de diccionario. En Delphi, tendrías que escribir algo similar tú mismo. –

+0

Entonces, de nuevo, ese 'diccionario' que escribiría debería llamarse de alguna manera desde afuera. No es una tarea fácil, aunque es técnicamente posible. La pregunta es, ¿es una característica lo suficientemente valiosa como para incluirla en su código? –

6

Es completamente una función de depuración. De hecho, el objeto thread ni siquiera hace un seguimiento de su propio nombre. Lo envía directamente al depurador, pero no almacena una copia del nombre por sí mismo. No se puede acceder desde su propio programa o desde cualquier otro lugar, excepto el depurador.