[英]C++: _beginthreadex, thread function name not showing in Visual Studio Threads window
我最近了解到::_beginthreadex()
總是比::CreateThread()
更好,所以我改變了所有使用::CreateThread()
調用。
唯一的缺點是我不再在Visual Studio的Threads
窗口中看到線程函數的名稱,這使得很難快速識別線程。 我假設當我使用::CreateThread()
,調試器會以某種方式自動完成,因為參數完全相同,我只是更改了所用函數的名稱。
有沒有辦法繼續使用::_beginthreadex()
並在Visual Studio的Threads
窗口中查看線程的名稱?
發生這種情況是因為_beginthreadex()
使用自己的線程函數調用CreateThread()
,該函數調用您指定的函數(因此調試器使用_threadstartex
函數名稱 - _beginthreadex()
調用的函數名稱)。
您可以使用MSDN中的SetThreadName()
示例SetThreadName()
手動設置線程名稱。 您可能想要做的是為_beginthreadex()
創建自己的包裝器,它可能看起來像:
uintptr_t startthreadex(
void* security,
unsigned stacksize,
unsigned (__stdcall * threadproc) (void *),
void* args,
unsigned flags,
unsigned * pThread_id,
char* thread_name)
{
unsigned alt_thread_id;
if (!pThread_id) {
pThread_id = & alt_thread_id;
}
uintptr_t result = _beginthreadex(security, stacksize, threadproc, args, flgas, pThread_id);
if (result == 0) return result;
SetThreadName( *pThread_id, thread_name);
}
現在你可以調用startthreadex()
而不是_beginthreadex()
並傳遞一個線程名稱。 這樣做的一個小優點是,如果你使用相同的函數來運行多個線程,你可以輕松地為它們提供每個唯一的名稱,這些名稱反映了線程或其他任何傳遞的參數。
如果您希望線程名稱自動成為線程proc函數名稱作為調試器的線程名稱,您可以創建一個包裝函數名稱參數的包裝器宏(它只需要另一個間接級別或解決任何問題.. )。
這是SetThreadName()
(來自http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx ):
//
// 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)
{
}
}
使用_beginthreadex
不是CreateThread
沒有特別的優勢。 CRT函數最終只會調用CreateThread
。
你應該閱讀:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.