目录Qt简单的异步操作Qt异步变同步问题解决的问题如何实现代码块解析Qt简单的异步操作 在实际应用中,经常会遇到一些耗时操作,导致了主线程的阻塞,这时候可以使用异步操作来避免阻塞。
在实际应用中,经常会遇到一些耗时操作,导致了主线程的阻塞,这时候可以使用异步操作来避免阻塞。
Qt的异步操作需要使用下面的库
#include <QtConcurrent/QtConcurrent>
然后将耗时操作丢进下面的函数中即可。
QtConcurrent::run([=]()
{
func();
});
如果需要判断耗时操作执行完毕与否,可以使用QFuture和QFutureWatcher的结合。QFuture 表示异步计算的结果,QFutureWatcher 则允许使用信号和槽监视 QFuture。
代码如下。
QFutureWatcher<void> *pwatcher = nullptr;
pwatcher = new QFutureWatcher<void>;
//把扫描到的wifi信息输出到指定文件
QFuture<void> future = QtConcurrent::run([=]()
{
func(); //耗时操作
});
connect(pwatcher, &QFutureWatcher<void>::finished, this, [=]()
{
core(); //主线程操作
});
pwatcher->setFuture(future);
QtConccurent管理的线程实际是从线程池分配线程资源的,而绑定QFutureWatcher的槽是在主线程中执行的。
在需要单次执行且内部逻辑较简单的时候使用QtConccurrent + QFuture + QFutureWatcher是很方便的,可以减少很多编码工作量,而且在多cpu环境中,QtConccurent也会启用多核。
很多情况会出现多线程程序,再进行操作时候,其中一个线程的逻辑执行需要另外一个线程的一个信号,那么异步变同步就变得无比重要
使用:QEventLoop类
The QEventLoop class provides a means of entering and leaving an event loop.
QEventLoop类提供了一种进入和离开事件循环的方法。
At any time, you can create a QEventLoop object and call exec() on it to start a local event loop. From within the event loop, calling exit() will force exec() to return.
在任何时候,您都可以创建一个QEventLoop对象并在其上调用exec()来启动一个本地事件循环。 在事件循环中,调用exit()将强制返回exec()。
QEventLoop q;
QTimer t;
t.setSingleShot(false);
connect(&t, &QTimer::timeout, this, [=](){
//TODO SOMETHING
});
connect(this, SIGNAL(connectStatusChangedSig()), &q, SLOT(quit())); //异步调用完成退出
t.start(50);
q.exec();
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: Qt之简单的异步操作实现方法
本文链接: https://lsjlt.com/news/171226.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0