名前のないスレッドを名前付きのスレッドに変換する

提供: RAD Studio
移動先: 案内検索

スレッドに名前を付ける への移動


名前のないスレッドを名前付きのスレッドに変換することができます。たとえば、Delphi 6 以前のバージョンで作成したスレッド クラスがある場合に、それを名前付きのスレッドに変換するなどです。

Delphi で名前のないスレッドを名前付きのスレッドに変換するには:

  1. スレッドが宣言されているユニットの uses 句に Windows ユニットを追加します。
    uses
        Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF};
    
  2. interface セクションで、スレッド クラスに SetName メソッドを追加します。
    type
    TMyThread = class(TThread)
    private
      procedure SetName;
    protected
      procedure Execute; override;
    end;
    
  3. 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]フィールドにスレッドの名前が表示されます。
  4. スレッドの Execute メソッドの先頭に、作成した SetName メソッドの呼び出しを追加します。
    procedure TMyThread.Execute;
    begin
      SetName;
      { Place thread code here }
    end;
    

C++Builder で名前のないスレッドを名前付きのスレッドに変換するには:


名前のないスレッドを名前付きのスレッドに変換することができます。たとえば、C++Builder 5 以前のバージョンで作成したスレッド クラスがある場合に、以下のステップを使用して、それを名前付きのスレッドに変換するなどです。

  1. スレッド クラスに 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]フィールドにスレッドの名前が表示されます。

  2. スレッドの Execute メソッドの先頭に、作成した SetName メソッドの呼び出しを追加します。
    void __fastcall TMyThread::Execute() {
    	SetName();
    	// ---- Place existing Execute method code here ----
    }
    

関連項目