Estoy tratando de encontrar una mejor comprensión de las señales Qt y las ranuras en conjunto con los hilos. Así que he intentado esta aplicación mínima:El hilo Qt no se detiene después de llamar a exit/quit
foo.h:
#include <QObject>
class A : public QObject {
Q_OBJECT
public:
void doit();
signals:
void x();
};
class B : public QObject {
Q_OBJECT
public slots:
void h();
};
foo.cpp:
#include "foo.h"
#include <QThread>
#include <QCoreApplication>
void B::h() {
qDebug("[%d] B::h() here!", (int) QThread::currentThreadId());
QCoreApplication::instance()->quit();
}
void A::doit() {
qDebug("[%d] emitting...", (int) QThread::currentThreadId());
emit x();
}
int main(int argc, char* argv[]) {
QCoreApplication app(argc, argv);
A a;
B b;
QObject::connect(&a, SIGNAL(x()), &b, SLOT(h()));
QThread t;
t.start();
b.moveToThread(&t);
a.doit();
t.wait();
return 0;
}
todo está bien, sólo el t.wait() al final nunca se regresa. Mi entendimiento es que llamar a quit() debería detener el ciclo de eventos, lo que significa que debe regresar exec() y, por lo tanto, debe ejecutarse() y la ejecución de subprocesos debe detenerse. ¿Me estoy perdiendo de algo?
El nombre de sus métodos debe explicitar su propósito. – UmNyobe
¡No se preocupe, esto no es código de producción! Encuentro que los nombres falsos funcionan mucho mejor en el código de muestra/prueba corto, que los nombres artificialmente descriptivos. – Elektito
Estoy de acuerdo con UmNyobe. Sería más fácil leer y comprender el código de muestra si usó nombres más informativos. P.ej. A :: doit() -> A :: emitThreadStart(), void x() -> startThread(), void h() -> void quitApplication() ... etc – Dmitriy