gpt4 book ai didi

multithreading - Delphi 中的命名线程 - 这是做什么用的?

转载 作者:行者123 更新时间:2023-12-03 14:56:31 32 4
gpt4 key购买 nike

当您使用 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 映射到您喜欢的任何名称。
你看到的黑客做了一个令人讨厌的把戏。引发的异常由调试器捕获,调试器仅将其作为特殊异常处理并继续执行。异常标志只是告诉系统在引发异常后继续,因为代码将处理它。空的 except 子句正在处理代码中的异常。这只是与调试器通信的一个肮脏技巧,调试器会处理异常并记住您刚刚传递给它的名称...

关于multithreading - Delphi 中的命名线程 - 这是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3864306/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com