Pregunta

No estoy llamando exec() en mi código, pero el timer y QUdpSocket está trabajando muy bien. Se exec() utiliza para esperar una event para continuar?

ACTUALIZACIÓN: el timer estaba trabajando, porque no me había llamado moveToThread(this) en el QThread, lo que significaba la QThread en realidad era todavía parte de la main thread. En cuanto a QUdpSocket bien que usar el functions de votación. Por lo que no necesita trabajar con signals.

TIP: si usted necesita para hacer cosas init, que requiere una event loop en su QThread, puede llamar delay moveToThread hasta que no necesita el signals más, que es práctico cuando el programa se está cargando. También no es necesario llamar en el constructor (que se podría llamar el interior run() por ejemplo), sólo tienes que copiar el puntero this QThread a una variable y hacer que el call tarde / en otro lugar con el puntero.

¿Fue útil?

Solución

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 método run() protegida de la QThread deriva clase.

evita las discusiones Separa bucle de ejecución del bucle QApplication conseguir lleno de señales y ranuras no relacionados con la interfaz de usuario, y por lo tanto retrasar la ejecución ranura botón .e.g de clic, por lo que su aplicación "retraso".

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

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

Otros consejos

Su temporizador y el zócalo son probablemente utilizando el bucle de eventos principal que se inicia cuando se llama QCoreApplication::exec(). Aunque estoy seguro de que hay una buena razón para ejecutar un bucle de eventos dentro de un hilo, no puedo llegar a uno.

El QThread documentación estados:

  

Cada QThread puede tener su propio ciclo de eventos. Puede iniciar el ciclo de eventos llamando a exec (); puede detenerlo llamando a exit () o salir (). Tener un bucle de eventos en un hilo hace que sea posible la conexión de señales de otros hilos a las ranuras en este hilo, utilizando un mecanismo llamado conexiones en cola. También hace que sea posible el uso de las clases que requieren que el bucle de eventos, tales como QTimer y QTcpSocket, en el hilo. Nótese, sin embargo, que no es posible el uso de cualquier clase de widgets en el hilo.

Sin un bucle de eventos, es posible emitir señales que son procesadas por el hilo GUI, o un hilo diferente que contiene un bucle de eventos. Esto implica que un hilo debe tener un bucle de eventos para que sus ranuras para ser eficaz. Por la documentación anterior, algunas clases, como QTimer , requieren un bucle de eventos para los que se ejecuta debe llamar QThread::exec() . Otras clases, como QTCPSocket tienen capacidad para ejecutar con con o sin un bucle de eventos, dependiendo de las funciones utilizadas. La documentación de las clases debe indicar lo que, en su caso, los requisitos que tienen.

depende de sus programas. He aquí 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 será llamado 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. OnTransfer se llamará.

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