5

Delphi 2010 の Delphi スレッドで「NameThreadForDebugging」にアクセスするにはどうすればよいですか?

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;
4

4 に答える 4

13

このNameThreadForDebugging関数は、その名前が示すように、デバッグ専用です。他の目的で名前を追跡したい場合は、スレッド オブジェクトにフィールドを予約して、そこに名前を保存します。そのフィールドを使用して、スレッドに名前を付け、オンデマンドでフォームのキャプションを設定します。

スレッドには API レベルで名前がないため、スレッドの名前を取得するための API はありません。NameThreadForDebuggingIDE が「このスレッドに名前を付ける」例外として認識する特別な例外を発生させます。例外を認識し (デバッガーであるため)、独自の内部デバッグ データ構造にスレッドの名前を記録し、アプリケーションの実行を継続できるようにします。アプリケーションは例外をキャッチして無視します。

ただし、そのデータ転送は一方向です。アプリケーションは例外を介してデバッガーに情報を送信できますが、デバッガーはデータを送り返すことができません。そして、OSはすべてを無視します。OSにとっては、他の例外と同じです。

于 2009-09-28T14:24:52.803 に答える
2

あなたが求めることを行うには、名前にアクセスできるスレッドクラス内に Name を保存する必要があります。

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;
于 2011-09-11T10:55:56.850 に答える
0

Code Central のサンプルID: 21893 の DebugThreadSupport ユニット、Named Pipesは、古いバージョンの Delphi でスレッド名を設定する方法を示しています。

于 2009-09-29T18:58:42.657 に答える
-2

AFAICS Delphi は名前のみの設定をサポートしています。名前を取得するには、いくつかの Windows API 関数を呼び出す必要があります。

于 2009-09-28T14:15:14.310 に答える