【发布时间】:2011-09-15 14:50:28
【问题描述】:
我正在尝试在单独的线程中执行一些工作,并在工作完成后停止该线程。
我已经建立了这样的连接
thread.connect( workerClass, SIGNAL( finished() ), SLOT( quit() ) );
但是当我发出 finished() 信号时,quit() 插槽永远不会被调用。命令行不显示任何与失败连接相关的警告。
我创建了一个简单的测试项目来缩小问题范围,我得到了相同的行为:
TestClass.h:
#ifndef TESTCLASS_H
#define TESTCLASS_H
class TestClass : public QObject
{
Q_OBJECT
public:
TestClass() { }
signals:
void finished();
public slots:
void doWork();
}
#endif // TESTCLASS_H
TestClass.cpp:
#include "TestClass.h"
#include <QtCore/QDebug>
void TestClass::doWork()
{
qDebug() << "Starting";
for( long i = 0; i < 1000000000; i++ );
qDebug() << "Done";
emit finished();
};
和main.cpp:
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include "TestClass.h"
int main( int argc, char* argv[] )
{
QCoreApplication a( argc, argv );
TestClass testClass;
QThread testThread;
testClass.moveToThread( &testThread );
testThread.connect( &testClass, SIGNAL( finished() ), SLOT( quit() ) );
testClass.connect( &testThread, SIGNAL( started() ), SLOT( doWork() ) );
testThread.start();
testThread.wait();
return 0;
}
所以这就是我期望发生的事情:
- 一旦处理了
testThread.start(),就会调用线程的run()函数,该函数在内部调用exec()并启动一个事件循环。此外,它还会引发started()信号。 -
testClass已调用其doWork()插槽。 - 当
TestClass::doWork()完成时,它会抛出一个finished()信号。 -
testThread的事件循环接收信号并将其转发到其quit()槽 -
testThread.wait()在线程结束时从等待中返回。
步骤 1-3 有效,我得到了 qDebug() 输出。
问题出在第 4 步:信号被触发并转发到某个事件循环(我对其进行了一点调试,但无法弄清楚它被触发到了哪个事件循环),但从未调用过 quit() 插槽。
我做错了什么?
P.S.:请不要建议子类化 QThread,我尝试这种方式的全部目的是因为我想避免子类化 QThread。
【问题讨论】: