我知道在Windows下设置线程名称的非直观过程(请参阅“How to set name to a Win32 Thread?”)。有没有办法获得线程的名称?我没有看到任何允许我这样做的Windows API(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx)。
答案 0 :(得分:17)
线程实际上在Win32中没有名称。通过RaiseException
的过程只是与VS调试器的“秘密握手”,VS调试器实际存储TID =>名称映射。 Windows本身没有线程“名称”的概念。
答案 1 :(得分:12)
没有这样的WinAPI调用,因为不存在线程名称。
如果设置了线程名称,那么IDE的调试器将为您存储它,这样可以更容易地进行调试。 但是,通过Windows API调用,该名称永远不会真正附加到该线程。
如果在没有调试器的情况下运行应用程序,则设置线程名称无效,因此无法检索名称。
即使它可以访问 - 我也不会编写仅适用于附加调试器的代码。更好地将名称与手柄一起存储起来。
答案 2 :(得分:10)
从Windows 10版本1607开始,您现在可以使用GetThreadDescription()
获取线程的名称,假设SetThreadDescription()
用于设置线程的名称。
以下是一个例子:
HRESULT hr = GetThreadDescription(ThreadHandle, &data);
if (SUCCEEDED(hr))
{
wprintf(“%ls\m”, data);
LocalFree(data);
}
这是文档:
https://msdn.microsoft.com/en-us/library/windows/desktop/mt774972(v=vs.85).aspx