2010-02-26 20 views
7

No estoy llamando exec() en mi código, pero el timer y QUdpSocket está funcionando bien. ¿exec() solía esperar a que continúe un event?llamando al método QThread.exec() es necesario en QThread?

ACTUALIZACIÓN: el timer estaba funcionando, porque no me había llamado moveToThread(this) en el QThread, lo que significaba que el QThread en realidad era todavía parte de la main thread. En cuanto a QUdpSocket bien I utilizando la encuesta functions. Entonces no necesitó trabajar con signals.

Consejo: Si necesita hacer init cosas, que requiere una event loop en su QThread, puede llamar delaymoveToThread hasta que no necesita el signals más, que es práctico cuando el programa se está cargando. Tampoco necesita llamarlo en el constructor (puede llamarlo dentro de run() por ejemplo), simplemente copie el puntero this QThread en una variable y haga el call más tarde/en otro lugar usando el puntero.

Respuesta

2

Con el fin de utilizar realmente el hilo, en lugar de la ejecución del bucle QApplication, usted tiene que llamar moveToThread(this) dentro del constructor hilo y hacer un bucle de ejecución dentro del protegido run() método de su clase derivada QThread.

El bucle de ejecución de hilos separados impide que el bucle QApplication se llene de señales y slots no relacionados con la interfaz de usuario y, por lo tanto, retrasa la ejecución de la ranura de clic del botón g, haciendo que su aplicación sea "lenta".

Nota: Normalmente siempre subclase QThread, ver Qt doc para más información

Editar: doc Qt está mal, lea este hilo http://blog.qt.digia.com/2010/06/17/youre-doing-it-wrong/

+0

¿Qué quiere decir con "colocar un bucle de ejecución"? ¿Quiere decir llamar QThread.exec() o crear instancias de un bucle de QEvent (aunque no veo por qué tendría que hacer esto porque QThread proporciona uno pero la respuesta es escrito me hace pensar en eso) –

+0

evento loop es cualquier cosa que hace exec() y bloquea el código _after_ esa declaración class.exec(). En este caso, está destinado a ser QThread.exec(). Nota: Si la frecuencia de la señal es baja, puede descartar la idea de los hilos, ya que la mayoría de los comandos Qt que consumen parte del tiempo son asíncronos. – drahnr

+0

así que digamos que tengo un temporizador. Ahora si quiero que mi temporizador funcione, necesito llamar al ejecutivo. pero ¿y si necesito hacer un procesamiento en un bucle en mi método de ejecución, necesitaría llamar a Exec una vez en cada ciclo? ¿Qué pasa si el temporizador no está cerca de ser hecho y quiero hacer el mayor procesamiento posible mientras el temporizador se agota? Lo leí en alguna parte usando un temporizador con 0 timeout es útil para administrar el evento. –

4

El temporizador y el zócalo probablemente estén utilizando el bucle de evento principal que se inicia al llamar al QCoreApplication::exec(). Aunque estoy seguro de que hay una buena razón para ejecutar un bucle de eventos dentro de un hilo, no puedo encontrar uno.

Los QThread documentation estados:

Cada QThread puede tener su propio ciclo de eventos. Puede iniciar el ciclo de evento llamando a exec(); puede detenerlo llamando a exit() o quit(). Tener un bucle de evento en un hilo hace que sea posible conectar señales de otros hilos a las ranuras en este hilo, utilizando un mecanismo llamado conexiones en cola. También hace posible utilizar clases que requieren el bucle de eventos, como QTimer y QTcpSocket, en el hilo. Tenga en cuenta, sin embargo, que no es posible usar ninguna clase de widget en el hilo.

Sin un bucle de evento, es posible emitir señales que son procesadas por el hilo de la GUI, o un hilo diferente que contiene un bucle de evento. Esto implica que un hilo debe tener un bucle de evento para que sus ranuras sean efectivas. Según la documentación anterior, algunas clases, como QTimer, requieren un bucle de eventos en ejecución para el que debe llamar al QThread::exec(). Otras clases, como QTCPSocket tienen capacidades para ejecutarse con o sin un bucle de evento, dependiendo de las funciones utilizadas. La documentación de las clases debe indicar qué requisitos, si los hay, tienen.

+0

uno que podría pensar es al crear instancias de un QThread en main.cpp, es decir, fuera de QMainWindow. –

+1

El motivo principal es si tiene múltiples hilos o múltiples objetos en un hilo que no es GUI. De esta forma, las ranuras y las señales de esos objetos se pueden activar y ejecutar sin ralentizar el bucle de eventos de la GUI. –

+0

Publicación editada y aclaraciones agregadas. –

0

Se dependen de sus programas. Aquí hay un ejemplo:

void MyThread::run(){ 
    Curl * curl = new Curl(); 
    connect(curl, SIGNAL(OnTransfer(QString)), this, SLOTS(OnTransfer(QString))); 
    connect(curl, SIGNAL(OnDone()), curl, SLOTS(deleteLater())); 
    curl->Download("http://google.com"); 
    exec(); // this is an event loop in this thread, it will wait until you command quit() 
} 

void MyThread::OnTransfer(QString data){ 
    qDebug() << data; 
} 

Sin exec(), nunca se llamará a OnTransfer. Pero si su ejecución fuera crear rizos con este (MyThread asumir los padres es el hilo principal) como padre:

MyThread::MyThread(){ 
    curl = new Curl(this); 
    connect(curl, SIGNAL(OnTransfer(QString)), this, SLOTS(OnTransfer(QString))); 
    start(); 
} 
void MyThread::run(){ 
    curl->Download("http://google.com"); 
} 

Éste funcionará como se esperaba. Se llamará a OnTransfer.

Cuestiones relacionadas