Jok*_*_vD 2 qt multithreading qthread
有main功能:
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
Worker w;
QObject::connect(&w, SIGNAL(done()), &a, SLOT(quit()), Qt::QueuedConnection);
w.start();
int ret = a.exec();
w.quit();
w.wait();
return ret;
}
Run Code Online (Sandbox Code Playgroud)
而且有Worker定义:
class Worker : public QThread
{
Q_OBJECT
public:
Worker(QObject *parent=0);
protected:
void run();
protected slots:
void process_request();
private:
int ttl;
Messenger* messenger;
}
Worker::Worker(QObject * parent)
:QThread(parent),
ttl(5),
messenger(new Messenger(this))
{
moveToThread(this);
connect(messenger, SIGNAL(new_message()), SLOT(process_request()), Qt::QueuedConnection);
}
void Worker::finish(){
quit();
messenger->disconnectFromNetwork();
}
void Worker::run(){
messenger->connectToNetwork("somewhere");
exec();
emit done();
}
void Worker::process_request(){
net_message msg;
messenger->recv(msg);
// PROCESSING
messenger->send(msg);
BOOST_LOG_SEV(file_log, severity::notification) << "TTL = " << ttl;
if (--ttl == 0) {
finish();
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,对不起长时间的阐述.我们的想法是,Messenger存在于主线程中,并在工作人员收到新消息时对其进行调用,而工作者只生活一定数量的消息,然后停止并关闭整个应用程序.
但是有一个问题:日志文件有行TTL = -1,等等TTL = -2.它不应该,并且我能想到的唯一原因是quit()它不会完全结束事件循环:它允许在返回之前处理挂起事件exec().是这样吗?如果"不",那么可能导致这种行为?
首先,"你做错了".
其次,文档没有说明在调用exit之后事件循环中的队列状态是什么.exec()事件队列之后的返回可能是空的,以确保完成所有异步清理(如果这是最顶层的事件循环,在这种情况下是这样).
QEventLoop::processEvents是在每次检查之间调用事件循环应该退出.所以它看起来exec()只在队列为空时才返回.