質問

Linuxでスレッド名(GDBとHTOPで見えるもの)を設定できることを知っています 使用 prctl(). 。しかし、別のOSではこれが機能しない可能性があります。また、試してみることができました 使用 pthread_setname_np(), 、POSIXシステム全体でもう少し利用可能ですが、完全に互換性がありません。

だから私はもう少しポータブルな方法を持ちたいです、多分何か QThread 私が見つけていないものを提供します。そのような方法はありますか?

役に立ちましたか?

解決

には何もありません QThread ただし、バージョン4.8.3以降、スレッドのシステム名を手動で管理するAPIでは、QTはスレッドの名前をスレッドオブジェクトの名前に自動的に設定します(QObject::objectName()).

これは、の実装で処理されます QThread 以下で説明するように。

あなたはこのようなものを持っています qthread_unix.cpp:

#if (defined(Q_OS_LINUX) || defined(Q_OS_MAC) || defined(Q_OS_QNX))
static void setCurrentThreadName(pthread_t threadId, const char *name)
{
#  if defined(Q_OS_LINUX) && !defined(QT_LINUXBASE)
    Q_UNUSED(threadId);
    prctl(PR_SET_NAME, (unsigned long)name, 0, 0, 0);
#  elif defined(Q_OS_MAC)
    Q_UNUSED(threadId);
    pthread_setname_np(name);
#  elif defined(Q_OS_QNX)
    pthread_setname_np(threadId, name);
#  endif
}
#endif

/* 
 * [...]
 */

QString objectName = thr->objectName();

if (Q_LIKELY(objectName.isEmpty()))
    setCurrentThreadName(thr->d_func()->thread_id, thr->metaObject()->className());
else
    setCurrentThreadName(thr->d_func()->thread_id, objectName.toLocal8Bit());

と同等のもの qthread_win.cpp:

typedef struct tagTHREADNAME_INFO
{
    DWORD dwType;      // must be 0x1000
    LPCSTR szName;     // pointer to name (in user addr space)
    HANDLE dwThreadID; // thread ID (-1=caller thread)
    DWORD dwFlags;     // reserved for future use, must be zero
} THREADNAME_INFO;

void qt_set_thread_name(HANDLE threadId, LPCSTR threadName)
{
    THREADNAME_INFO info;
    info.dwType = 0x1000;
    info.szName = threadName;
    info.dwThreadID = threadId;
    info.dwFlags = 0;

    __try
    {
        RaiseException(0x406D1388, 0, sizeof(info)/sizeof(DWORD), (const ULONG_PTR*)&info);
    }
    __except (EXCEPTION_CONTINUE_EXECUTION)
    {
    }
}

/* 
 * [...]
 */

QByteArray objectName = thr->objectName().toLocal8Bit();
qt_set_thread_name((HANDLE)-1, objectName.isEmpty() ? thr->metaObject()->className() : objectName.constData());

Windowsでは、上記のコードが実行されないことに注意してください QT_NO_DEBUG したがって、設定されています うまくいきません リリース モード.

他のヒント

QTドキュメント 発見できる:

スレッドが与えられる名前を選択するには(たとえば、LinuxのコマンドPS -Lによって識別されます)、できるように、 スレッドを起動する前に、setObjectName()を呼び出します. 。 setObjectName()に電話しないと、スレッドに与えられた名前が クラス名 スレッドオブジェクトのランタイムタイプ(たとえば、マンデルブロットの例の場合の「renderthread」など、それはqthreadサブクラスの名前です)。これは現在、Windows上のリリースビルドでは利用できないことに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top