我知道在 Windows 下设置线程名称的非直观过程(请参阅“如何为 Win32 线程设置名称?”)。 有没有办法获取线程的名称? 我没有看到任何 Windows API 可以让我执行此操作 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx)。
线程在 Win32 中实际上没有名称。通过
RaiseException
的过程只是与 VS 调试器的“秘密握手”,VS 调试器实际上存储了 TID => 名称映射。 Windows 本身没有线程“名称”的概念。
从 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
不存在这样的 WinAPI 调用,因为不存在线程名称之类的东西。
如果您设置了线程名称,那么 IDE 的调试器将为您存储它,这使得调试更容易。 然而,该名称从未通过 Windows API 调用真正附加到线程。
如果您在没有调试器的情况下运行应用程序,则设置线程名称无效,因此您无法检索该名称。
即使它是可访问的 - 我也不会编写仅与附加的调试器一起工作的代码。最好将自己的名字和手柄一起存放。