Anzeigen: Delphi
C++
Anzeigeeinstellungen
Einen unbenannten Thread in einen benannten konvertieren
Aus RAD Studio XE2
Nach oben zu Thread-Objekte ausführen - Index
Nach oben zu C++Builder-Entwicklerhandbuch
Sie können einen unbenannten Thread in einen benannten Thread umwandeln. Wenn Sie beispielsweise über eine Thread-Klasse verfügen, die mit Delphi 6 oder einer früheren Version erstellt wurde, so können Sie diese in einen benannten Thread konvertieren.
So konvertieren Sie einen unbenannten Thread in einen benannten:
- Fügen Sie die Unit Windows in die uses-Klausel der Unit ein, in der Ihr Thread deklariert ist:
//---------------------------------------------------------------------------
uses
Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF};
//---------------------------------------------------------------------------
-
Fügen Sie dem interface-Abschnitt Ihrer Thread-Klasse die Methode SetName hinzu:
//--------------------------------------------------------------------------- type TMyThread = class(TThread) private procedure SetName; protected procedure Execute; override; end; //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- void TMyThread::SetName() { THREADNAME_INFO info; info.dwType = 0x1000; info.szName = "MyThreadName"; info.dwThreadID = -1; info.dwFlags = 0; __try { RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info ); } __except (EXCEPTION_CONTINUE_EXECUTION) { } } //---------------------------------------------------------------------------
-
Fügen Sie den Record TThreadNameInfo und die Methode SetName in den implementation-Abschnitt ein:
//--------------------------------------------------------------------------- {$IFDEF MSWINDOWS} type TThreadNameInfo = record FType: LongWord; // muss 0x1000 sein FName: PChar; // Zeiger auf den Namen (im Benutzer-Adressraum) FThreadID: LongWord; // Thread-ID (-1 gibt den Thread des Aufrufers an) FFlags: LongWord; // Für zukünftige Verwendung reserviert, muss null sein end; {$ENDIF} { TMyThread } procedure TMyThread.SetName; {$IFDEF MSWINDOWS} var ThreadNameInfo: TThreadNameInfo; {$ENDIF} begin {$IFDEF MSWINDOWS} ThreadNameInfo.FType := $1000; ThreadNameInfo.FName := 'MyThreadName'; ThreadNameInfo.FThreadID := $FFFFFFFF; ThreadNameInfo.FFlags := 0; try RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo ); except end; {$ENDIF} end; //---------------------------------------------------------------------------Hinweis: Setzen Sie TThreadNameInfo auf den Namen der Thread-Klasse.
- Der Debugger erkennt die Exception und ermittelt den Thread-Namen aus der übergebenen Struktur. Bei der Fehlersuche zeigt der Debugger den Namen des Thread im Thread-Statusfenster im Feld Thread-ID an.
-
Fügen Sie am Anfang der Methode Execute des Threads einen Aufruf für die neue Methode SetName ein:
//--------------------------------------------------------------------------- procedure TMyThread.Execute; begin SetName; { Thread-Code hier einfügen } end; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void __fastcall TMyThread::Execute() { SetName(); //---- Quelltext der Methode Execute hier einfügen ---- } //---------------------------------------------------------------------------