虽然我做了所有相同的事情(除了未注释的错误处理),但未调用Worker::process
。
我不知道我做错了什么。我认为,存在非常根本的问题。
代码:
class Worker : public QObject {
Q_OBJECT
public:
Worker(){};
~Worker(){};
public slots:
void process();
signals:
void finished();
void error(QString err);
private:
// add your variables here
};
void Worker::process()
{
while(1)
{
printf("\nHallo !");
}
emit finished();
}
int test_thread()
{
QThread* thread = new QThread;
Worker* worker = new Worker();
worker->moveToThread(thread);
//QObject::connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
QObject::connect(thread, SIGNAL(started()), worker, SLOT(process()));
QObject::connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
QObject::connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
return 0;
}
答案 0 :(得分:2)
你已经关闭了,但是你错过了一些关键概念。
想想代码
while(1)
{
printf("\nHallo !");
}
emit finished();
正在做。由于你的无限循环,永远不会发出finished
信号。尝试这样的事情:
int counter = 0;
const unsigned int max = 10;
while (++counter < max) {
print("\nHallo, iteration %d", counter);
}
emit finished();
您可以看到有用的工作正在完成,但随后会发出信号finished
。
QCoreApplication
是整个应用程序的信号代理。在没有启动的情况下,应用程序不会解释任何信号/槽,除非线程包含它自己的信号和槽定义。 注意:直接连接不需要事件循环。
要解决此问题,请在主要内容的这两行之间插入QCoreApplication::exec()
:
thread->start();
// put right here
return 0;
此外,您可能还想在线程返回时停止exec()
,但我会将此作为练习留给读者。