1

::_beginthreadex()最近、それが常により好ましいことを知った::CreateThread()ので、を使用するすべての呼び出しを変更し::CreateThread()ました。

唯一の欠点は、Visual StudioのThreadsウィンドウにスレッド関数の名前が表示されなくなり、スレッドをすばやく識別しにくくなることです。これは、使用したときにデバッガーによって自動的に行われたと思い::CreateThread()ます。パラメーターがまったく同じであるため、使用する関数の名前を変更しただけです。

Visual Studio::_beginthreadex()のウィンドウでスレッドの名前を使い続けて表示する方法はありますか?Threads

4

2 に答える 2

3

これは、指定したスレッド関数を呼び出す独自のスレッド関数を使用して呼び出すために発生します(したがって、デバッガーは_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)
   {
   }
}
于 2011-08-18T17:34:57.573 に答える
1

_beginthreadexoverを使用しても特に利点はありませんCreateThread。CRT関数は最終的にCreateThreadのみ呼び出すことになります。

あなたは読むべきです:

于 2011-08-18T17:25:02.240 に答える