En mi aplicación existe el hilo principal y un hilo de trabajo (QThread
).
Del hilo principal me gustaría invocar un método de mi hilo de trabajo y ejecutarlo en el contexto del hilo.Invocando métodos en el contexto de QThread
He intentado usar QMetaObject::invokeMethod
y darle la opción QueuedConnection
pero no está funcionando.
También intenté emitir señales desde el hilo principal (que está conectado a la ranura del hilo de trabajo) pero también falló.
He aquí un fragmento de aproximadamente lo que he intentado:
class Worker : public QThread
{
Q_OBJECT
public:
Worker() { }
void run()
{
qDebug() << "new thread id " << QThread::currentThreadId();
exec();
}
public slots:
void doWork()
{
qDebug() << "executing thread id - " << QThread::currentThreadId();
}
};
Utilizando el camino QMetaObject:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "main thread id - " << QThread::currentThreadId();
Worker worker;
worker.start();
QMetaObject::invokeMethod(&worker, "doWork", Qt::QueuedConnection);
return a.exec();
}
El uso de la forma de la señal:
class Dummy : public QObject
{
Q_OBJECT
public:
Dummy() { }
public slots:
void askWork() { emit work(); }
signals:
void work();
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "main thread id - " << QThread::currentThreadId();
Worker worker;
worker.start();
Dummy dummy;
QObject::connect(&dummy, SIGNAL(work()), &worker, SLOT(doWork()), Qt::QueuedConnection);
QTimer::singleShot(1000, &dummy, SLOT(askWork()));
return a.exec();
}
Ambos caminos conducen a la principal ID de hilo impreso en QThread
doWork
.
Además, pensé en implementar un productor-consumidor simple, pero si esto funciona, ¿hay alguna razón para no hacerlo de esta manera?
el subproceso de trabajo está en su bucle de evento debido a la llamada a exec() –