网站制作建,wordpress怎么登陆后台,实木餐桌椅网站建设,网页制作教程图解QEventLoop和QtConcurrent可以结合使用达到主线程ui不阻塞同步执行的效果#xff0c;但是要小心避坑#xff0c;查看如下代码#xff1a;
QEventLoop loop;
QtConcurrent::run([]()
{doSomething();loop.quit();
});
loop.exec();上述写法存在两个问题#xff1a;
Q…QEventLoop和QtConcurrent可以结合使用达到主线程ui不阻塞同步执行的效果但是要小心避坑查看如下代码
QEventLoop loop;
QtConcurrent::run([]()
{doSomething();loop.quit();
});
loop.exec();上述写法存在两个问题
QtConcurrent::run()执行后线程立即开始执行当doSomething()很快时loop.quit()的执行时间可能早于loop.exec()这样事件循环就再也不会退出了当doSomething因为某些原因crash时如果没有导致程序崩溃loop.quit无法被执行事件循环同样无法退出。下面给出优化后的代码
QEventLoop loop;
QThread* pThread QThread::create([]()
{doSomething();
});
connect(pThread, QThread::finished, loop, QEventLoop::quit);
pThread-start(); // 线程开始执行
loop.exec();这里注意两个点
connect必须在start之前这样即使线程执行很快我们也能保证信号和槽已经被connect连接槽函数会被执行connect默认第五个参数时Qt::AutoConnection在信号发出时由于信号发送线程和loop不在一个线程类型被推断为Qt::QueuedConnection所以finished信号生成的事件会放到事件队列中在loop.exec()的循环中被处理因此loop.exec一定会退出