Pregunta

Sé que puedo configurar el nombre del hilo (el visible en GDB y HTOP) en Linux usando prctl(). Pero con otra masa, esto probablemente no funcionará. Además, podría intentar usando pthread_setname_np(), que está un poco más disponible en los sistemas POSIX, pero aún carece de compatibilidad total.

Así que me gustaría tener una forma más portátil, tal vez algo QThread proporciona que no he encontrado. ¿Hay algo así?

¿Fue útil?

Solución

No hay nada en el QThread API para administrar manualmente el nombre del sistema del hilo, ya que desde la versión 4.8.3, QT establecerá automáticamente el nombre de su hilo en el nombre del objeto de subproceso (QObject::objectName()).

Esto se maneja en las implementaciones de QThread como se describe abajo.

Tienes algo como esto en 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());

Y el equivalente en 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());

Tenga en cuenta que en Windows, el código anterior no se ejecutará si QT_NO_DEBUG se establece, así no funcionará en Liberar modo.

Otros consejos

En Documentación QT puedes encontrar:

Para elegir el nombre que se le dará su hilo (como se identifica por el comando ps -l en Linux, por ejemplo), puede llamar setObjectName () antes de comenzar el hilo. Si no llama a setObjectName (), el nombre dado a su hilo será el nombre de la clase del tipo de tiempo de ejecución de su objeto de subproceso (por ejemplo, "Renderthread" en el caso del ejemplo de MandelBrot, ya que ese es el nombre de la subclase QTHREAD). Tenga en cuenta que esto no está disponible actualmente con las compilaciones de versión en Windows.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top