如何获取Win32线程的名称?

问题描述 投票:0回答:3

我知道在 Windows 下设置线程名称的非直观过程(请参阅“如何为 Win32 线程设置名称?”)。 有没有办法获取线程的名称? 我没有看到任何 Windows API 可以让我执行此操作 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx)。

c++ windows multithreading winapi unmanaged
3个回答
20
投票

线程在 Win32 中实际上没有名称。通过

RaiseException
的过程只是与 VS 调试器的“秘密握手”,VS 调试器实际上存储了 TID => 名称映射。 Windows 本身没有线程“名称”的概念。


19
投票

从 Windows 10 版本 1607 开始,您现在可以使用

GetThreadDescription()
获取线程的名称,假设使用
SetThreadDescription()
设置线程的名称。

这是一个例子:

PWSTR data;
HRESULT hr = GetThreadDescription(ThreadHandle, &data);
if (SUCCEEDED(hr))
{   
    wprintf(L"%ls\n", data);
    LocalFree(data);
}

这是文档:

https://msdn.microsoft.com/en-us/library/windows/desktop/mt774972(v=vs.85).aspx


12
投票

不存在这样的 WinAPI 调用,因为不存在线程名称之类的东西。

如果您设置了线程名称,那么 IDE 的调试器将为您存储它,这使得调试更容易。 然而,该名称从未通过 Windows API 调用真正附加到线程。

如果您在没有调试器的情况下运行应用程序,则设置线程名称无效,因此您无法检索该名称。

即使它是可访问的 - 我也不会编写仅与附加的调试器一起工作的代码。最好将自己的名字和手柄一起存放。

© www.soinside.com 2019 - 2024. All rights reserved.