Frage

Ich weiß Verwendung prctl(). Aber mit einem anderen Osen wird dies höchstwahrscheinlich nicht funktionieren. Außerdem konnte ich es versuchen Verwendung pthread_setname_np(), was in Possix -Systemen etwas mehr verfügbar ist, aber dennoch fehlt die vollständige Kompatibilität.

Ich möchte also etwas tragbarerer Weg haben, vielleicht etwas QThread Angeboten, was ich nicht gefunden habe. Gibt es einen solchen Weg?

War es hilfreich?

Lösung

Es gibt nichts in der QThread API, um den Systemnamen des Threads manuell zu verwalten. Da Version 4.8.3 jedoch den Namen Ihres Threads automatisch auf den Namen des Thread -Objekts festlegt (QObject::objectName()).

Dies wird in den Implementierungen von behandelt QThread wie unten beschrieben.

Du hast so etwas in 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());

Und das Äquivalent in 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());

Beachten Sie, dass der obige Code unter Windows nicht ausgeführt wird, wenn QT_NO_DEBUG ist so eingestellt, also Es wird nicht funktionieren Veröffentlichung Modus.

Andere Tipps

Im QT -Dokumentation Sie können finden:

Um den Namen zu wählen, den Ihr Thread angegeben wird (wie beispielsweise der Befehl ps -l unter Linux identifiziert), können Sie Anruf setObjectName (), bevor Sie den Thread starten. Wenn Sie SetObjectName () nicht aufrufen, lautet der Name Ihrem Thread die Klassenname des Laufzeittyps Ihres Thread -Objekts (z. B. "Renderthread" im Fall des Mandelbrot -Beispiels, da dies der Name der QThread -Unterklasse ist). Beachten Sie, dass dies derzeit nicht mit Release -Builds unter Windows verfügbar ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top