是否可以命名 CWinThread 线程?

发布于 2024-10-17 14:11:19 字数 200 浏览 1 评论 0原文

我有一个 C++ 应用程序(VS2008),我启动这样的线程:

CWinThread *myThread= AfxBeginThread(myOp,0);

现在我要做的就是命名这个线程,这样我就可以在调试时识别它。

这听起来像是一个简单的任务,但我找不到方法来完成它。这可能吗?如果可能的话,如何实现?

I have a C++ application (VS2008), and I start threads like this:

CWinThread *myThread= AfxBeginThread(myOp,0);

Now all I wan to do is name this thread, so I can identify it while debugging.

It sounds like a simple task, but I could not find the way to do it. Is this possible, and if so, how?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

输什么也不输骨气 2024-10-24 14:11:19

这可以相对容易地完成,如 MSDN:如何在本机中设置线程名称代码

本质上,您向调试器发送一个包含名称和线程 ID 的神奇异常,然后调试器会跟踪并显示您发送给它的名称。

MSDN 文章中的示例代码如下:

//
// Usage: SetThreadName (-1, "MainThread");
//
#include <windows.h>
const DWORD MS_VC_EXCEPTION=0x406D1388;

#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
   DWORD dwType; // Must be 0x1000.
   LPCSTR szName; // Pointer to name (in user addr space).
   DWORD dwThreadID; // Thread ID (-1=caller thread).
   DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)

void SetThreadName( DWORD dwThreadID, char* threadName)
{
   THREADNAME_INFO info;
   info.dwType = 0x1000;
   info.szName = threadName;
   info.dwThreadID = dwThreadID;
   info.dwFlags = 0;

   __try
   {
      RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
   }
   __except(EXCEPTION_EXECUTE_HANDLER)
   {
   }
}

This can be done relatively easily as documented on MSDN: How to set a Thread Name in Native Code.

Essentially you send the debugger a magic exception containing the name and the thread ID, and the debugger then keeps track of and displays the name you sent it.

The sample code from the MSDN article is included below:

//
// Usage: SetThreadName (-1, "MainThread");
//
#include <windows.h>
const DWORD MS_VC_EXCEPTION=0x406D1388;

#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
   DWORD dwType; // Must be 0x1000.
   LPCSTR szName; // Pointer to name (in user addr space).
   DWORD dwThreadID; // Thread ID (-1=caller thread).
   DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)

void SetThreadName( DWORD dwThreadID, char* threadName)
{
   THREADNAME_INFO info;
   info.dwType = 0x1000;
   info.szName = threadName;
   info.dwThreadID = dwThreadID;
   info.dwFlags = 0;

   __try
   {
      RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
   }
   __except(EXCEPTION_EXECUTE_HANDLER)
   {
   }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文