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.
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:
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.