2012-02-01 11 views
7

Desidero visualizzare un nome descrittivo nella finestra dell'elenco di thread mentre è in uso l'IDE Delphi 6. Ho trovato il codice qui sotto sul web per farlo in Delphi 6 poiché so che la versione non ha SetThreadName() implementato in modo nativo. Lo chiamo dal metodo Execute() del mio thread. So che viene chiamato perché l'IDE si apre quando viene sollevata l'eccezione. Tuttavia, quando guardo nella lista dei thread (Ctrl + Alt + T), non vedo il nome che ho impostato. Ho appena visto le solite Id Thread, State, Status e Location, nient'altro.È questo il modo corretto per impostare il nome di un thread in Delphi 6?

Cosa devo fare in modo diverso per visualizzare i nomi dei thread? Inoltre, qualcuno ha un'idea su come fermare l'IDE dalla pausa sulla linea RaiseException? Ho un sacco di discussioni nel programma ed è fastidioso avere l'IDE spuntando N volte ogni volta che eseguo il programma.
So che posso disabilitare l'IDE dall'arresto delle eccezioni Delphi, ma lo desidero normalmente e preferirei non doverlo attivare e disattivare ogni volta che viene creato un nuovo set di thread.

Named threads in Delphi - what is that for?

procedure SetThreadName_delphi(const Name: string); 
    type 
     TThreadNameInfo = 
     record 
      RecType: LongWord; 
      Name: PChar; 
      ThreadID: LongWord; 
      Flags: LongWord; 
     end; 
var 
    info:TThreadNameInfo; 
begin 
    // This code is extremely strange, but it's the documented way of doing it! 

    info.RecType := $1000; 
    info.Name := PChar(Name); 
    info.ThreadID := $FFFFFFFF; 
    info.Flags := 0; 

    try 
     RaiseException($406D1388, 0, 
     SizeOf(info) div SizeOf(LongWord), PDWord(@info)); 
    except 
    end; 
end; 
+1

Credo che il nome del thread sia visibile solo in Delphi 2010 e versioni successive. – Nat

+0

No, la denominazione dei thread è stata supportata da D6. –

+1

Scratch che - Delphi 7. –

risposta

6

ho trovato the original code

Si tratta di un'eccezione specifica per l'applicazione (che significa che è specifico per ++ compilatore Visual C). Non vedo alcun motivo per cui Delphi dovrebbe supportare questa strana funzionalità (anche se è possibile).


Edit: ma funziona! (Grazie a Remy Lebeau)

appena testato su Delphi XE (vedo nel debugger 'stato Discussione' finestra 'Wow!'):

unit NameTest; 

interface 

uses 
    Windows, Classes; 

type 
    TTestThread = class(TThread) 
    private 
    { Private declarations } 
    protected 
    procedure Execute; override; 
    end; 

implementation 

{ TTestThread } 

procedure SetThreadName_delphi(const Name: string); 
    type 
     TThreadNameInfo = 
     record 
      RecType: LongWord; 
      Name: PAnsiChar; 
      ThreadID: LongWord; 
      Flags: LongWord; 
     end; 
var 
    info:TThreadNameInfo; 
    AnsiName: AnsiString; 

begin 
    AnsiName:= Name; 
    info.RecType := $1000; 
    info.Name := PAnsiChar(AnsiName); 
    info.ThreadID := $FFFFFFFF; 
    info.Flags := 0; 
    try 
     RaiseException($406D1388, 0, 
     SizeOf(info) div SizeOf(LongWord), PDWord(@info)); 
    except 
    end; 
end; 

procedure TTestThread.Execute; 
begin 
    SetThreadName_delphi('Wow!'); 
    while not Terminated do 
    Sleep(1000); 
end; 

end. 
+3

Sì, lo fa. La denominazione dei thread è stata introdotta in D6 e utilizza la stessa identica eccezione di Visual Studio. –

+1

Utilizza la stessa eccezione magica in modo che il debugger delphi possa mostrare i nomi dei thread denominati in dll codificati in msvc. –

+0

snippet awsome! – opc0de

5

In C++ Builder e Delphi 6 7 in poi , la procedura guidata File > New > Other > Thread Object ha un'opzione per denominare il nuovo thread nel debugger. La procedura guidata genera una classe derivante TThread discendente con l'implementazione RaiseException() necessaria nella parte superiore del suo metodo Execute().

Questo non è un aiuto per Delphi 6, che non supporta ancora la denominazione dei thread.

+0

L'ho appena provato e l'unica cosa nel metodo Execute() generato era il commento "Inserisci codice del thread qui". –

+0

Inoltre, ho appena provato il codice di Serg, che sembra differire solo dallo snippet che ho postato usando PAnsiChar (AnsiName) invece di PChar (Name), e ancora * non * vedo i nomi dei thread (Delphi 6) . –

+0

Apparentemente non è stato implementato fino a Delphi 7, mi dispiace. –

Problemi correlati