簡體   English   中英

C ++:_ begingureadex,線程函數名稱未在Visual Studio線程窗口中顯示

[英]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)
   {
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM