Qt 如何并发异步调用?
QT += core concurrent widgets
template<typename T, typename Handler>
void await(const QFuture<T> &future, QObject *context, Handler handler)
{
auto *watcher = new QFutureWatcher<T>(context);
QObject::connect(watcher, &QFutureWatcherBase::finished,
context, [watcher, handler { std::move(handler) }]() {
handler(watcher->result());
watcher->deleteLater();
});
watcher->setFuture(future);
}
template<typename Handler>
auto async(Handler handler)
{
// 默认使用全局线程池,线程池大小与使用者电脑相关。
return QtConcurrent::run(QThreadPool::globalInstance(),handler);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 使用 async 启动异步函数
auto func = async([](){
auto total{0ull};
for(auto i = 0;i < 10000000;i++){
total += i;
}
return total;
});
// 使用 await 非阻塞式获取异步函数结果
await(func,qApp,[](auto ret){
qDebug() << "total:" << ret;
});
// 异步调用耗时函数,同时通过 Qt信号和槽机制 返回结果。
await(async([](){
return 0;
}),qApp,[](int){
qDebug() << "call test";
});
QWidget w;
qDebug() << "ui";
w.show();
return a.exec();
}
// output
/*!
ui
call test
total: 49999995000000
*/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)