在Visual Studio 2010扩展包下运行时重命名C ++线程

时间:2010-09-13 14:12:50

标签: c++ visual-studio visual-studio-2010

我正在使用以下代码(来自MSDN)重命名C ++线程:

#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)
   {
   }
}

总体而言,这项工作非常有效。但是,当尝试在Visual Studio(2010)扩展包中执行此代码时,我得到以下无法处理的异常,并且该线程的名称不会更改:

发生了System.Runtime.InteropServices.SEHException 消息:外部组件抛出了异常。

任何人都知道那里发生了什么?我意识到从扩展程序更改线程可能存在一些问题,但是,它没有文档记录,并且它似乎在标准加载项中正常工作。

谢谢!

2 个答案:

答案 0 :(得分:2)

我不确定这是否是导致问题的原因,但根据this MSDN文档,SetThreadName函数仅适用于本机代码。从异常情况来看,你看到你正在使用/clr选项进行编译,所以你应该使用与此相当的托管代码。按照第一个链接中另请参阅部分下的链接,它会显示用于托管代码的代码段。

HTH, 与Ashish。

答案 1 :(得分:1)

听起来很熟悉。以下是SetThreadName的内部结构(在混合本机C ++,C ++ / CLI,C#应用程序中):

#pragma warning(disable: 6312 6322)
        __try
        {
            RaiseException( 0x406D1388, 0, sizeof(info) / sizeof(DWORD), (DWORD*)&info );
        }
        // don't implement MSDN's suggested fix for 6312 here - it causes a nasty unhandled exception
        // to bubble up into managed code. Disable the compiler warning instead.
        __except(EXCEPTION_CONTINUE_EXECUTION)
        {
        }
#pragma warning(default: 6312 6322)