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 级别没有名称。NameThreadForDebugging引发 IDE 识别为“命名此线程”异常的特殊异常。它看到异常(因为它是一个调试器),在它自己的内部调试数据结构中记录线程的名称,然后允许应用程序继续运行。应用程序捕获并忽略异常。

不过,这种数据传输是单向的。应用程序可以通过异常向调试器发送信息,但调试器无法发回数据。操作系统对一切都视而不见。对于操作系统来说,它就像任何其他例外一样。

于 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 example ID: 21893, Named Pipes上的单元 DebugThreadSupport显示了如何在旧版本的 Delphi 中设置线程名称。

于 2009-09-29T18:58:42.657 回答
-2

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

于 2009-09-28T14:15:14.310 回答