es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener el HANDLE del hilo de Windows API (WinAPI) desde un QThread?

Me gustaría usar la función CancelSynchronousIo(), por lo que necesito un identificador de hilo. En mi aplicación de QT tengo dos hilos: mainThread (gui) y secondThread para cálculos. Me gustaría usar CancelSynchronousIo() en mainThread para cancelar operaciones en secondThread. No sé cómo obtener el identificador de hilo de winapi desde la clase Qt.

He intentado:

MainThread:

thread = new QThread(this);
simpleObject = new SimpleClass();
connect(this, &MainWindow::getHandle, simpleObject , &simpleClass::getHandle);
simpleObject->moveToThread(thread);
thread->start();

SimpleObject, que está en el segundo hilo:

void simpleClass::getHandle() // este es un slot en simpleObject, que está en el segundo hilo
{
emit handleFromSecondThread(GetCurrentThread());
}

Veo que el valor de GetCurrentThread() en el segundo hilo es el mismo que el valor de GetCurrentThread() en mainThread.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, la función GetCurrentThread() devuelve un pseudo-handle que no puede ser utilizado con funciones como CancelSynchronousIo(). Sin embargo, hay una forma de obtener un handle real a partir de un objeto QThread. Puede utilizar la función QThread::currentThreadId() para obtener un identificador específico de la plataforma del thread actual y luego pasarlo a la función OpenThread() que devuelve un handle real del thread.

    Aquí tienes un ejemplo que muestra cómo obtener un handle del segundo thread:

    // En el mainThread:
    DWORD secondThreadId = simpleObject->thread()->currentThreadId();
    HANDLE secondThreadHandle = OpenThread(THREAD_ALL_ACCESS, FALSE, secondThreadId);
    // Utiliza secondThreadHandle con la función CancelSynchronousIo()
    

    Otra cosa a tener en cuenta es que debes tener cuidado al cancelar operaciones en otro thread, ya que esto puede dar lugar a comportamientos inesperados e indefinidos. En general, es mejor utilizar primitivas de sincronización como eventos o mutexes para detener de forma segura la ejecución de un thread.

Comments are closed.