我知道在Windows下设置线程名称的过程并不直观(请参见“如何为Win32线程设置名称?”)。 有没有方法可以获取线程的名称? 我没有看到任何Windows API可以让我这样做(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx)。
我知道在Windows下设置线程名称的过程并不直观(请参见“如何为Win32线程设置名称?”)。 有没有方法可以获取线程的名称? 我没有看到任何Windows API可以让我这样做(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx)。
在Win32中,线程实际上没有名称。通过RaiseException
方法与VS调试器进行"秘密握手",才能将TID(线程ID)和名称进行映射存储。Windows本身并不知道线程的"名称"。
从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
由于不存在线程名称,因此不存在WinAPI调用。
如果您设置了线程名称,则IDE的调试器将为您存储它,这使得调试更加容易。 但是,该名称从未通过Windows API调用真正附加到线程上。
如果在没有调试器的情况下运行应用程序,则设置线程名称无效,因此您无法检索名称。
即使可以访问-我也不会编写仅在附加调试器时才有效的代码。最好将名称与句柄一起存储。