2011-08-26 12 views
5

Mantendré el código simple para que puedan ver lo que estoy tratando de hacer;) Soy consciente de todos los problemas de bloqueo, etc. Estoy intentando para descubrir cómo las señales y las ranuras juegan con los hilos.Uso de Qt donde hilo de trabajo crea elementos nuevos de GUI

En main.cpp:

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 
    MyConsole c;  // Subclasses QThread and implements run() 
    MyReceiver r(app); // We pass app to MyReceiver for later (see below) 
    QObject::connect(&c, SIGNAL(sendit()), 
        &r, SLOT(gotit())); 
    c.start();   // Start the worker thread 
    app.exec(); 
} 

Supongamos que las señales y las ranuras se han establecido correctamente en los archivos de cabecera (que he probado y que son). Ahora, aquí está el problema:

En MyReceiver.cpp:

void MyReceiver::gotit() 
{ 
    QLabel *label = new QLabel(0, "Hello"); // Some GUI element, any will do 
    app.setMainWidget(*label);    // Some GUI action, any will do 
} 

La pregunta es: porque el objeto MyReceiver fue creado en main(), que está en el hilo principal, ¿quiere decir que las ranuras (Por ejemplo, gotit()) se ejecutará en el hilo principal y por lo tanto son seguros para hacer cosas de GUI? Incluso en los casos en que la señal se elevó desde un QThread diferente (como MyConsole en este ejemplo)?

Existe una mejor manera de permitir que los subprocesos de trabajo interactúen con la GUI (por ejemplo, Obj-C/Cocoa tiene un tipo de enfoque de "enviar mensaje en el subproceso principal"). ¿Cuál es la "forma de Qt" de hacer esto?

¡Gracias de antemano!

+0

¿Te responde http://stackoverflow.com/questions/638251/how-to-emit-cross-thread-signal-in-qt? –

Respuesta

1

El "camino Qt" para emitir una señal de un hilo y recibirlo en un hilo diferente es el uso de una conexión en cola

connect(obj, SIGNAL(foo()), other_obj, SLOT(bar()), Qt::QueuedConnection) 

A partir de la documentación de Qt para Qt :: QueuedConnection:

La ranura se invoca cuando el control regresa al bucle de evento del hilo del receptor. La ranura se ejecuta en el hilo del receptor.

5

De forma predeterminada (Qt :: AutoConnection), las ranuras se ejecutarán en el subproceso en el que se creó QObject. Por lo tanto, no importa de qué subproceso se emita la señal, la ranura se ejecutará siempre en el subproceso, el QObject " vive "in" (si un ciclo de evento Qt se está ejecutando en ese hilo, de lo contrario el evento no puede ser entregado). Como el hilo principal se convertirá en el hilo de la GUI de Qt, funcionará como se esperaba. Esta es de hecho la forma Qt de interactuar con la GUI. Vea también: http://doc.qt.nokia.com/4.7/thread-basics.html (busque la afinidad del hilo).

+0

"no importa de qué hilo emite la señal, la ranura se ejecutará siempre en el mismo hilo" esta frase es un poco ambigua, parece que la ranura siempre se ejecutará en el mismo hilo desde el que se emitió la señal. Sé que no lo dices de esta manera (ya que el resto de tu respuesta es correcta), pero puede confundir a los demás. –

+1

bien, eso fue ambiguo, lo he vuelto a expresar. gracias por el comentario. – awx

+0

Debe tenerse en cuenta que aún puede enviar señales incluso sin ejecutar los bucles de ejecución. Simplemente llame a 'QCoreApplication :: processEvents()' periódicamente y, para todos los fines previstos, será como si tuviera ejecutados bucles de ejecución. Esto es ideal para situaciones en las que no puede devolver el control del bucle al sistema operativo, pero aún necesita las entradas/salidas de señales de diferentes hilos. – g19fanatic

Cuestiones relacionadas