2010-10-05 17 views
6

Quando si crea un discendente TThread utilizzando la tavolozza degli strumenti nel BDS, è possibile fornire un nome per il thread. Ecco il codice generato automaticamente. Basta chiamare la funzione SetName() nel metodo Execute e il filo di chiamare questo metodo viene assegnato un nome in una sorta di strano modo ...Discussioni denominate in Delphi: a cosa serve?

{$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; 

Trovo veramente utile durante il debug per non si può vedere solo TID, ma anche nomi di thread assegnati in questo modo. Sai qual è il filo grazie a questo.

Per favore dimmi, tuttavia, se il nome assegnato è accessibile in qualsiasi modo. Può essere letto in base alla maniglia di un thread? O può essere letto anche da "fuori" il processo con un altro processo? Sai, ci sono applicazioni che elencano i tuoi processi e i thread che vi lavorano. Questo nome sarà accessibile ad app del genere?

Grazie!

+0

Per chiunque cerchi come impostare il nome del thread WHILE nel debugger, questo docwiki l'argomento dovrebbe aiutare: Manualmente: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Naming_a_Thread_While_Debugging Nel codice: http://docwiki.embarcadero.com/Libraries/Seattle/en/System.Classes.TThread.NameThreadForDebugging –

risposta

9

In realtà, i nomi dei thread sono utilizzati solo per scopi di debug e nient'altro, davvero. Nel tuo codice, puoi semplicemente identificare i thread usando il ThreadID. E se vuoi mantenere un nome con quegli ID di thread, tieni un elenco separato (dizionario) che mappa ogni ID di thread con qualsiasi nome tu voglia.
L'hack che vedi fa un brutto scherzo. L'eccezione che viene sollevata viene catturata dal debugger, che la gestisce come un'eccezione speciale e continuerà solo l'esecuzione. Il flag di eccezione dice al sistema di continuare dopo che l'eccezione è stata sollevata, poiché il codice lo gestirà. La clausola except vuota sta gestendo l'eccezione all'interno del codice. È solo un trucco sporco per comunicare con il debugger, che zira l'eccezione e ricorda il nome che hai appena passato ...

+0

Grazie per una chiara spiegazione. Quindi c'è un altro modo per assegnare un nome a un thread in modo che possa vederlo dall'esterno? Immagino che non ci sia, ma voglio solo assicurarmi :). Grazie –

+0

In realtà, i thread sono senza nome. Ma per assegnare loro un nome, usa una matrice dinamica con due valori per elemento: uno per ID, uno per il nome. In .NET, c'è una classe dizionario. In Delphi, dovresti scrivere qualcosa di simile da te. –

+0

Quindi, di nuovo, quel "dizionario" che scrivi dovrebbe essere richiamabile in qualche modo dall'esterno. Non è un compito facile, anche se è tecnicamente possibile. La domanda è, è una funzionalità abbastanza valida da includere nel tuo codice? –

6

È interamente una funzione di debug. In effetti, l'oggetto thread non tiene nemmeno traccia del proprio nome. Lo invia direttamente al debugger, ma non memorizza una copia del nome per se stesso. Non è accessibile dal tuo programma o da nessun'altra parte, ad eccezione del debugger.