Multithreading Delphi中的命名线程-这是为了什么?

Multithreading Delphi中的命名线程-这是为了什么?,multithreading,delphi,Multithreading,Delphi,使用BDS中的工具选项板创建TThread子体时,可以提供线程的名称。这是自动生成的代码。您只需在Execute方法中调用SetName()函数,调用此方法的线程就会以一种奇怪的方式获得一个名称 {$IFDEF MSWINDOWS} type TThreadNameInfo = record FType: LongWord; // must be 0x1000 FName: PChar; // pointer to name (in user addre

使用BDS中的工具选项板创建TThread子体时,可以提供线程的名称。这是自动生成的代码。您只需在Execute方法中调用SetName()函数,调用此方法的线程就会以一种奇怪的方式获得一个名称

{$IFDEF MSWINDOWS}
type
  TThreadNameInfo = record
    FType: LongWord;     // must be 0x1000
    FName: PChar;        // pointer to name (in user address space)
    FThreadID: LongWord; // thread ID (-1 indicates caller thread)
    FFlags: LongWord;    // reserved for future use, must be zero
  end;
{$ENDIF}

{ TTestThread }

procedure TTestThread.SetName;
{$IFDEF MSWINDOWS}
var
  ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
  ThreadNameInfo.FType := $1000;
  ThreadNameInfo.FName := 'ThreadName';
  ThreadNameInfo.FThreadID := $FFFFFFFF;
  ThreadNameInfo.FFlags := 0;

  try
    RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
  except
  end;
{$ENDIF}
end;
我发现它在调试期间非常有用,因为您不仅可以看到TID,还可以看到以这种方式分配的线程名称。你知道哪根线是哪根,多亏了它

但是,请告诉我是否可以以任何方式访问指定的名称。它可以根据线程的句柄读取吗?或者,它可以被另一个进程从进程“外部”读取吗?你知道,有些应用程序会列出你的进程和在其中工作的线程。这样的应用程序可以访问此名称吗


谢谢

这完全是一种调试功能。事实上,线程对象甚至没有记录自己的名称。它直接将其发送到调试器,但不为自己存储名称的副本。除了调试器之外,它不能从您自己的程序内部或其他任何地方访问。

实际上,线程名称只是用于调试目的,实际上没有其他用途。在代码中,您可以通过使用ThreadID来识别线程。如果您想保留带有这些线程ID的名称,请保留一个单独的(字典)列表,将每个线程ID映射到您喜欢的任何名称。

你看到的黑客做了一个下流的把戏。引发的异常由调试器捕获,调试器仅将其作为特殊异常处理,并将继续执行。异常标志只是告诉系统在引发异常后继续,因为代码将处理它。empty except子句正在处理代码中的异常。与调试器通信只是一个肮脏的把戏,调试器将处理异常并记住您刚刚传递给它的名称…

感谢您的清晰解释。那么,有没有其他方法可以为线程指定一个名称,以便我可以从外部看到它?我想没有,但我只是想确定:)。谢天谢地,线程是无名的。但是要给它们指定一个名称,请使用一个动态数组,每个元素有两个值:一个用于ID,一个用于名称。在.NET中,有一个字典类。在Delphi中,你必须自己写一些类似的东西。然后,你要写的“字典”应该可以从外部调用。这不是一项容易的任务,尽管在技术上是可能的。问题是,它是一个有价值的特性,足以包含在您的代码中吗?好的,谢谢。我想我知道怎么做,但这对我来说并不重要。我只是想知道命名线程是否可行。谢谢你的帮助!对于在调试器中搜索如何设置线程名称的任何人,此docwiki主题应有帮助:手动:在代码中: