如何在Delphi 2010中访问“NameThreadForDebugging”?

5

我如何在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;
4个回答

13

NameThreadForDebugging 函数只用于调试。如果您想追踪线程的名称以便于其他目的,则应在线程对象中保留一个字段并将名称存储在其中,并使用该字段命名线程和按需填充窗体标题。

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

但是,该数据传输是单向的。应用程序可以通过异常向调试器发送信息,但调试器无法发送数据回来。操作系统对此毫不知情。对于操作系统而言,它就像任何其他异常一样。


3
作为一个小补充,使用这种方法来命名线程在IDE中是惯例。特别是,Visual Studio 也能识别。 - Paul-Jan
另请参阅Chris Hesik的博客文章:http://blogs.embarcadero.com/chrishesik/2009/10/22/34895 - Jeroen Wiert Pluimers
那篇博客已被作者删除,但文章仍在这里http://web.archive.org/web/20101214193506/http://blogs.embarcadero.com/chrishesik/2009/10/22/34895,另外请参考这个SO问题:https://dev59.com/EFDTa4cB1Zd3GeqPNe8J - Jeroen Wiert Pluimers

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;

0

Code Central示例ID: 21893,命名管道上的DebugThreadSupport单元演示了如何在旧版本的Delphi中设置线程名称。


你在这里写的是正确的,但实际上并没有回答问题。此外,你链接的代码提供了一种命名线程的方法,但它和内置的VCL代码一样,并没有提供获取名称的方法。 - Rob Kennedy

-2
据我所知,Delphi只支持设置名称。您必须调用一些Windows API函数来获取名称。

-1 是因为Delphi并不是唯一支持线程命名的IDE,而且在API层面没有API可以检索线程名称(除了.NET),因此线程名称不可用。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接