2012-02-01 22 views
7

Delphi 6 IDEでスレッドリストウィンドウに表示される素敵なユーザーフレンドリーな名前を使用したいと思います。 Delphi 6でこれを行うためのWeb上のコードは、バージョンには基本的に実装されたSetThreadName()がないことが分かっています。私はスレッドのExecute()メソッドから呼び出す。例外が発生したときにIDEがポップアップするため、呼び出されていることがわかります。しかし、スレッドリスト(Ctrl + Alt + T)を見ると、設定した名前は表示されません。私はちょうど通常のスレッドID、状態、状態、および場所の列、何も表示されません。これはDelphi 6でスレッドの名前を設定する正しい方法ですか?

スレッド名を表示するには、どうすればよいですか?また、誰でもIDEがRaiseException行を一時停止するのを止める方法を知っていますか?プログラムにスレッドがたくさんあるので、プログラムを実行するたびにIDEがN回ポップアップするのは面倒です。
私はDelphiの例外で停止するIDEを無効にすることができます知っているが、私は通常それをしたいと思うし、スレッドの新しいセットが作成されるたびにオフにする必要はありません。

Named threads in Delphi - what is that for?

procedure SetThreadName_delphi(const Name: string); 
    type 
     TThreadNameInfo = 
     record 
      RecType: LongWord; 
      Name: PChar; 
      ThreadID: LongWord; 
      Flags: LongWord; 
     end; 
var 
    info:TThreadNameInfo; 
begin 
    // This code is extremely strange, but it's the documented way of doing it! 

    info.RecType := $1000; 
    info.Name := PChar(Name); 
    info.ThreadID := $FFFFFFFF; 
    info.Flags := 0; 

    try 
     RaiseException($406D1388, 0, 
     SizeOf(info) div SizeOf(LongWord), PDWord(@info)); 
    except 
    end; 
end; 
+1

スレッド名はDelphi 2010以上でのみ表示されると思います。 – Nat

+0

いいえ、スレッドネーミングはD6以降サポートされています。 –

+1

その傷 - デルファイ7 –

答えて

6

私はそれが(それはそれは、Visual C++コンパイラの具体的であることを意味する)、アプリケーション固有の例外であるthe original code

を発見しました。私はDelphiがこの奇妙な機能をサポートする必要はないと考えています(可能ですが)。


編集しかし、それは働きます!(レミールボーのおかげで)

ちょうど(私が見デバッガ 'スレッド・ステータス' ウィンドウで 'うわー!')デルファイXEでテスト:C++ Builderの6以降のDelphi 7で

unit NameTest; 

interface 

uses 
    Windows, Classes; 

type 
    TTestThread = class(TThread) 
    private 
    { Private declarations } 
    protected 
    procedure Execute; override; 
    end; 

implementation 

{ TTestThread } 

procedure SetThreadName_delphi(const Name: string); 
    type 
     TThreadNameInfo = 
     record 
      RecType: LongWord; 
      Name: PAnsiChar; 
      ThreadID: LongWord; 
      Flags: LongWord; 
     end; 
var 
    info:TThreadNameInfo; 
    AnsiName: AnsiString; 

begin 
    AnsiName:= Name; 
    info.RecType := $1000; 
    info.Name := PAnsiChar(AnsiName); 
    info.ThreadID := $FFFFFFFF; 
    info.Flags := 0; 
    try 
     RaiseException($406D1388, 0, 
     SizeOf(info) div SizeOf(LongWord), PDWord(@info)); 
    except 
    end; 
end; 

procedure TTestThread.Execute; 
begin 
    SetThreadName_delphi('Wow!'); 
    while not Terminated do 
    Sleep(1000); 
end; 

end. 
+3

はい、そうです。スレッドネーミングはD6で導入され、Visual Studioとまったく同じ例外を使用します。 –

+1

msvcでコード化されたdllで指定されたスレッドの名前を表示できるように、同じ魔法の例外が使用されます。 –

+0

awsome snippet! – opc0de

5

File > New > Other > Thread Objectウィザードには、デバッガで新しいスレッドの名前を付けるオプションがあります。ウィザードは、Execute()メソッドの先頭に必要なRaiseException()実装を持つスタブTThread子孫クラスを生成します。

これは、まだスレッドの命名をサポートしていなかったDelphi 6では役に立ちませんでした。

+0

私はそれを試しましたが、生成されたExecute()メソッドの唯一のことは、 "Place thread code here"というコメントでした。 –

+0

また、私はPChar(Name)の代わりにPAnsiChar(AnsiName)を使用して投稿したスニペットとは異なるように見えるSerg'sコードを試しましたが、まだスレッド名(Delphi 6) 。 –

+0

明らかにDelphi 7まで実装されていませんでした。 –

関連する問題