2009-09-28 14 views
5

Jak uzyskać dostęp do "NameThreadForDebugging" w wątku delphi w Delphi 2010?Jak uzyskać dostęp do "NameThreadForDebugging" w Delphi 2010

type 
    TMyThread = class(TThread) 
    protected 
    procedure Execute; override; 
    procedure UpdateCaption; 
    end; 

implementation 

procedure TMyThread.UpdateCaption; 
begin 
    Form1.Caption := 'Name Thread For Debugging'; 
    // how I get 'TestThread1' displayed in the caption 
end; 


procedure TMyThread.Execute; 
begin 
    NameThreadForDebugging('TestThread1'); 
    Synchronize(UpdateCaption); 
    Sleep(5000); 
end; 

Odpowiedz

13

Funkcja NameThreadForDebugging jest, jak sama nazwa wskazuje, wyłącznie do debugowania. Jeśli chcesz śledzić nazwę dla innych celów, zarezerwuj pole w obiekcie wątku i zapisz tam nazwę. Użyj tego pola do nazywania wątku i do wypełniania podpisu formularza na żądanie.

Brak interfejsu API do pobierania nazwy wątku, ponieważ wątki nie mają nazw na poziomie interfejsu API. NameThreadForDebugging podnosi wyjątek specjalny, który IDE rozpoznaje jako wyjątek "nazwij ten wątek". Widzi wyjątek (ponieważ jest to debugger), odnotowuje nazwę wątku we własnych wewnętrznych strukturach danych debugowania, a następnie pozwala aplikacji kontynuować działanie. Aplikacja przechwytuje i ignoruje wyjątek.

Ten transfer danych jest jednokierunkowy. Aplikacja może wysyłać informacje do debuggera za pośrednictwem wyjątku, ale debugger nie może wysłać danych z powrotem. System operacyjny jest niepomny na wszystko. Dla systemu operacyjnego jest to tak jak każdy inny wyjątek.

+3

Jako mały dodatek, używanie tej metody do nazywania wątków _jest_ konwencją wśród IDE. W szczególności Visual Studio również je podnosi. –

+0

Zobacz także wpis w blogu Chrisa Hesika: http://blogs.embarcadero.com/chrishesik/2009/10/22/34895 –

+0

Ten blog został usunięty przez autora, ale artykuł nadal znajduje się tutaj http: // web. archive.org/web/20101214193506/http://blogs.embarcadero.com/chrishesik/2009/10/22/34895 również zobacz to pytanie: http://stackoverflow.com/questions/3864306/named-threads-in -delphi-what-is-that-for –

-2

AFAICS Delphi obsługuje ustawienia tylko nazwy. Będziesz musiał wywołać funkcję Windows API, aby uzyskać nazwę.

+0

-1 ponieważ Delphi nie jest jedynym, który obsługuje IDE nazwy wątku, a ponieważ nie ma interfejsu API, aby pobrać nazwę wątku (można oczekiwać w .NET), ponieważ nazwy wątków nie są dostępne w warstwie interfejsu API. –

0

Jednostka DebugThreadSupport w przykładzie kodu centralnego kodu ID: 21893, Named Pipes, pokazuje jak ustawić nazwę wątku w starszych wersjach Delphi.

+0

To, co tu napisałeś, jest prawdą, ale tak naprawdę nie odpowiada na pytanie. Ponadto, kod, który został połączony, pozwala na podanie nazwy wątku, ale podobnie jak wbudowany kod VCL nie zapewnia sposobu na pobranie nazwy. –

2

Aby to zrobić, o co prosisz, trzeba zapisać nazwę wewnątrz klasy gwintu gdzie masz do niego dostęp, np:

type 
    TMyThread = class(TThread) 
    protected 
    FName: String; 
    procedure Execute; override; 
    procedure UpdateCaption; 
    end; 

procedure TMyThread.UpdateCaption; 
begin 
    Form1.Caption := FName; 
end; 

procedure TMyThread.Execute; 
begin 
    FName := 'TestThread1'; 
  NameThreadForDebugging(FName); 
  Synchronize(UpdateCaption); 
  Sleep(5000); 
end; 
Powiązane problemy