문제

Linux에서 스레드 이름 (GDB 및 HTOP에서 보이는 이름)을 설정할 수 있다는 것을 알고 있습니다. 사용 prctl(). 그러나 다른 OS를 사용하면 대부분 작동하지 않을 것입니다. 또한 시도 할 수 있습니다 사용 pthread_setname_np(), POSIX 시스템에서 조금 더 사용할 수 있지만 여전히 완전한 호환성이 부족합니다.

그래서 나는 더 휴대하는 방법을 갖고 싶다. QThread 내가 찾지 못한 제공. 그런 방법이 있습니까?

도움이 되었습니까?

해결책

아무것도 없습니다 QThread 그러나 스레드의 시스템 이름을 수동으로 관리하려면 API 버전 4.8.3이므로 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 ()을 호출하지 않으면 스레드에 주어진 이름이 클래스 이름 스레드 오브젝트의 런타임 유형 (예 : MandelBrot 예제의 경우 "RenderThread"의 Qthread 서브 클래스의 이름입니다). Windows에서 릴리스 빌드에서는 현재 사용할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top