2009-09-28 7 views
5

Delphi 2010のdelphiスレッドで 'NameThreadForDebugging'にアクセスするにはどうすればよいですか?Delphi 2010で '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; 

答えて

13

NameThreadForDebugging機能は、その名前が示すように、デバッグのためだけです。他の目的のために名前を追跡したい場合は、スレッドオブジェクトにフィールドを予約し、そこに名前を格納します。このフィールドを使用してスレッドの名前を指定し、必要に応じてフォームのキャプションを設定します。

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

データ転送は片方向ですが、アプリケーションは例外を介してデバッガに情報を送信できますが、デバッガはデータを返信できません。そして、OSはすべてを忘れています。 OSにとっては、他の例外と同様です。

+3

少しの補足として、スレッドネーミングのためにこのメソッドを使用することは、IDE間での規則です。特に、Visual Studioもそれを選択します。 –

+0

Chris Hesikもこのブログエントリを参照してください:http://blogs.embarcadero.com/chrishesik/2009/10/22/34895 –

+0

そのブログは著者によって削除されましたが、記事はまだhttp:// webです。 archive.org/web/20101214193506/http://blogs.embarcadero.com/chrishesik/2009/10/22/34895こちらもご参照ください:http://stackoverflow.com/questions/3864306/named-threads-in -delphi-what-is-that-for –

-2

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

+0

-1 Delphiはスレッド名をサポートする唯一のIDEではないため、と理由スレッド名はAPIレイヤーでは使用できないため、スレッド名を取得するAPIはありません(.NETで期待されます)。 –

0

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

+0

あなたがここに書いたものは本当ですが、実際にはその質問には答えません。また、リンクしたコードは、スレッドに名前を付ける方法を提供しますが、組み込みのVCLコードのように、名前をフェッチする方法はありません。 –

2

あなたが求めるものを行うには、あなたがそれにアクセスすることができ、あなたのスレッドのクラス、例えば内部の名前を格納する必要があります。

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; 
関連する問題