如何访问Delphi 2010中的“NameThreadForDebugging”

时间:2009-09-28 13:54:06

标签: delphi delphi-2010

如何在Delphi 2010中的delphi Thread中访问'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 个答案:

答案 0 :(得分:13)

NameThreadForDebugging函数,顾名思义,仅用于调试。如果要为其他目的跟踪名称,请在线程对象中保留一个字段并将名称存储在那里。使用该字段命名线程并按需填充表单的标题。

没有用于检索线程名称的API,因为线程在API级别没有名称。 NameThreadForDebugging引发了一个特殊的异常,IDE将其识别为“命名此线程”异常。它看到异常(因为它是一个调试器),在它自己的内部调试数据结构中记下线程的名称,然后允许应用程序继续运行。应用程序捕获并忽略该异常。

但数据传输是单向的。应用程序可以通过异常向调试器发送信息,但调试器无法发回数据。操作系统对一切都没有注意到。对于操作系统,它就像任何其他例外一样。

答案 1 :(得分: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;

答案 2 :(得分:0)

代码中心示例ID: 21893, Named Pipes上的单元DebugThreadSupport,显示了如何在旧版本的Delphi中设置线程名称。

答案 3 :(得分:-2)

AFAICS Delphi仅支持名称设置。你必须调用一些Windows API函数来获取名称。