これは、指定したスレッド関数を呼び出す独自のスレッド関数を使用して呼び出すために発生します(したがって、デバッガーは_beginthreadex()
関数名(呼び出す関数)を使用します)。CreateThread()
_threadstartex
_beginthreadex()
SetThreadName()
MSDNの例を使用して、スレッド名を自分で手動で設定できます。あなたがしたいと思うかもしれないことは_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()
てスレッド名を渡すことができます。これの小さな利点は、同じ関数を使用して複数のスレッドを実行する場合、スレッドなどに渡されたパラメーターを反映するそれぞれの一意の名前を簡単に付けることができることです。
スレッド名をデバッガーのスレッド名として自動的にthreadproc関数名にする場合は、関数名パラメーターを文字列化するラッパーマクロを作成できます(必要なのは、別のレベルの間接参照または問題の解決だけです。 。)。
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)
{
}
}