Question

Je sais que je peux définir le nom du thread (celui visible dans GDB et HTOP) dans Linux utilisant prctl(). Mais avec une autre OSE, cela ne fonctionnera probablement pas. Aussi, je pourrais essayer utilisant pthread_setname_np(), qui est un peu plus disponible sur les systèmes POSIX, mais manque toujours de compatibilité complète.

Alors j'aimerais avoir un moyen plus portable, peut-être quelque chose QThread Fournit ce que je n'ai pas trouvé. Y a-t-il un tel moyen?

Était-ce utile?

La solution

Il n'y a rien dans le QThread API pour gérer manuellement le nom du système du thread, cependant, depuis la version 4.8.3, QT définira automatiquement le nom de votre thread sur le nom de l'objet de thread (QObject::objectName()).

Ceci est géré dans les implémentations de QThread comme décrit ci-dessous.

Vous avez quelque chose comme ça dans 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());

Et l'équivalent dans 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());

Notez que sur Windows, le code ci-dessus ne sera pas exécuté si QT_NO_DEBUG est réglé, donc ça ne fonctionnera pas dans Sortie mode.

Autres conseils

Dans Documentation QT tu peux trouver:

Pour choisir le nom que votre fil sera donné (comme identifié par la commande ps -l sur Linux, par exemple), vous pouvez appel setObjectName () avant de démarrer le fil. Si vous n'appelez pas setObjectName (), le nom donné à votre fil sera le nom du cours du type d'exécution de votre objet de thread (par exemple, "RenderThread" dans le cas de l'exemple Mandelbrot, car c'est le nom de la sous-classe QThread). Notez que cela n'est actuellement pas disponible avec les versions de version sur Windows.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top