【发布时间】:2010-10-03 11:51:10
【问题描述】:
我有一个使用“很多”线程的服务器应用程序。不想讨论它真正应该使用多少线程,如果能够在调试器“线程”窗口中看到一些描述性文本来描述每个线程是什么,而不必单击它并根据上下文确定它是什么。
它们都具有相同的起始地址,因此线程窗口通常会显示类似“thread_base::start”或类似的内容。我想知道是否有 API 调用或允许我自定义该文本的东西。
【问题讨论】:
标签: c++ multithreading winapi
我有一个使用“很多”线程的服务器应用程序。不想讨论它真正应该使用多少线程,如果能够在调试器“线程”窗口中看到一些描述性文本来描述每个线程是什么,而不必单击它并根据上下文确定它是什么。
它们都具有相同的起始地址,因此线程窗口通常会显示类似“thread_base::start”或类似的内容。我想知道是否有 API 调用或允许我自定义该文本的东西。
【问题讨论】:
标签: c++ multithreading winapi
【讨论】:
这是我使用的代码。
这在头文件中。
#pragma once
#define MS_VC_EXCEPTION 0x406d1388
#pragma warning(disable: 6312)
#pragma warning(disable: 6322)
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; // must be 0x1000
LPCSTR szName; // pointer to name (in same addr space)
DWORD dwThreadID; // thread ID (-1 caller thread)
DWORD dwFlags; // reserved for future use, most be zero
} THREADNAME_INFO;
inline
void SetThreadName(DWORD dwThreadID, LPCSTR szThreadName)
{
#ifdef _DEBUG
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = szThreadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
__try
{
RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(DWORD), (DWORD *)&info);
}
__except (EXCEPTION_CONTINUE_EXECUTION)
{
}
#else
dwThreadID;
szThreadName;
#endif
}
然后我在线程过程中这样称呼它。
SetThreadName(GetCurrentThreadId(), "VideoSource Thread");
值得注意的是,这是 David 发布链接的确切代码(谢谢!我忘记了从哪里得到的)。我没有删除这篇文章,因为如果 MSDN 决定(再次)重新组织其链接,我希望代码仍然可用。
【讨论】:
Windows 10 添加了SetThreadDescription(),在那个平台上这将是最好的方法。
【讨论】: