这是主要部分。主线程无法获得信号形式工作线程
此代码创建一个工作者和一个工作线程。
工人被转移到工作地点。
工人正在等待信号让它工作。
工作完成后,工作人员发出信号并显示结果。
主要应该捕获该信号并初始化主变量。
main()
{.........
// This is the variable to be changed
variableToGetFromWorker = 0;
qDebug() << "Main thread: " << QThread::currentThreadId();
QThread workerThread;
worker* stupidTom = new stupidTom(number);
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, &workerThread, &QObject::deleteLater);
connect(&workerThread, SIGNAL(start()), stupidTom, SLOT(doJob()));
connect(stupidTom, SIGNAL(jobDone(int)), this, SLOT(jobDone(int)));
workerThread.start();
workerThread.wait();
...........}
// This is a slot at main. Suppose to catch the signal from the worker
void main::jobDone(int result)
{
qDebug() << "Changing variable";
variableToGetFromWorker = result;
}
这是工人的doJob插槽。
void worker::doJob()
{
qDebug() << "worker::doJob invoked.";
qDebug() << "worker Thread:" << QThread::currentThreadId();
// Doing Job here
emit jobDone(result);
}
这是qDebug导致
Main thread: 0x7ffff7fc6780
worker::doJob invoked.
worker Thread: 0x7fffdab44700
在调试模式下,我发现程序是停在workerThread.wait()
,从来没有去main::jobDone(int result)
。是什么原因?在主码
小编辑:
QThread workerThread;
worker* stupidTom = new stupidTom(number);
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, &workerThread, &QObject::deleteLater);
connect(&workerThread, SIGNAL(started()), stupidTom, SLOT(doJob()));
connect(stupidTom, SIGNAL(jobDone(int)), this, SLOT(jobDone(int)));
connect(stupidTom, SIGNAL(jobDone(int)), &workerThread, SLOT(quit()));
workerThread.start();
workerThread.wait();
我不明白添加eventloop的原因。首先,我很抱歉有一个错字。我正在使用你指出的connect(&workerThread,SIGNAL(start()),stupidTom,SLOT(doJob()));'。 worker对象是我创建的对象,仅用于传递给线程。 – tom
参考你提到的文章,我增加了一个连接'connect(stupidTom,SIGNAL(jobDone(int)),&workerThread,SLOT(quit()));'。当'jobDone()'被释放时,它假设退出线程。没有连接警告。我知道'发射jobDone(result);'真的发射了。但是很确定'mainDown()'没有被调用,因为debug msg没有被打印。 – tom
jobDone()不能被调用,因为跨线程信号需要接收线程中的事件循环才能运行。该事件循环也不能永久封锁,因为调用workerThread.wait()会执行。 –