名前のないスレッドを名前付きのスレッドに変換する
スレッドに名前を付ける への移動
名前のないスレッドを名前付きのスレッドに変換することができます。たとえば、Delphi 6 以前のバージョンで作成したスレッド クラスがある場合に、それを名前付きのスレッドに変換するなどです。
Delphi で名前のないスレッドを名前付きのスレッドに変換するには:
-
スレッドが宣言されているユニットの uses 句に Windows ユニットを追加します。
uses Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF};
- interface セクションで、スレッド クラスに SetName メソッドを追加します。
type TMyThread = class(TThread) private procedure SetName; protected procedure Execute; override; end;
-
implementation セクションに、TThreadNameInfo レコードと SetName メソッドを追加します。
{$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} { 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;
メモ: TThreadNameInfo にスレッド クラスの名前を設定してください。
- デバッガは、例外を見つけると、渡した構造体の中のスレッド名を探します。デバッグ時には、[スレッドの状態]ウィンドウの[スレッド ID]フィールドにスレッドの名前が表示されます。
-
スレッドの Execute メソッドの先頭に、作成した SetName メソッドの呼び出しを追加します。
procedure TMyThread.Execute; begin SetName; { Place thread code here } end;
C++Builder で名前のないスレッドを名前付きのスレッドに変換するには:
名前のないスレッドを名前付きのスレッドに変換することができます。たとえば、C++Builder 5 以前のバージョンで作成したスレッド クラスがある場合に、以下のステップを使用して、それを名前付きのスレッドに変換するなどです。
- スレッド クラスに SetName メソッドを追加します。
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) { } }
メモ:
info.szName
にスレッド クラスの名前を設定してください。デバッガは、例外を見つけると、渡した構造体の中のスレッド名を探します。デバッグ時には、[スレッドの状態]ウィンドウの[スレッド ID]フィールドにスレッドの名前が表示されます。
- スレッドの Execute メソッドの先頭に、作成した SetName メソッドの呼び出しを追加します。
void __fastcall TMyThread::Execute() { SetName(); // ---- Place existing Execute method code here ---- }