Qt之简单的异步操作实现方法

 更新时间:2022年11月10日 15:20:05   作者:超级小清  
这篇文章主要介绍了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也会启用多核。

Qt异步变同步问题

解决的问题

很多情况会出现多线程程序,再进行操作时候,其中一个线程的逻辑执行需要另外一个线程的一个信号,那么异步变同步就变得无比重要

如何实现

使用: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();

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++实现校园导游系统

    C++实现校园导游系统

    这篇文章主要为大家详细介绍了C++实现校园导游系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言利用模板实现简单的栈类

    C语言利用模板实现简单的栈类

    这篇文章主要为大家详细介绍了C语言利用模板实现简单的栈类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • c++快速排序详解

    c++快速排序详解

    快速排序总体思想:先找到一个枢轴,让他作为分水岭。通过一趟排序将待排序的记录分割成独立的两部分,前面一部分都比枢轴小,后面一部分逗比枢轴大,然后又分别对这两部分记录继续进行递归的排序,达到整个序列有序的目的。
    2017-05-05
  • C++两个cpp文件间如何进行各自函数的调用方式

    C++两个cpp文件间如何进行各自函数的调用方式

    这篇文章主要介绍了C++两个cpp文件间如何进行各自函数的调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C语言实现简单翻译功能

    C语言实现简单翻译功能

    这篇文章主要为大家详细介绍了C语言实现简单翻译功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C语言实现数独游戏的求解

    C语言实现数独游戏的求解

    这篇文章主要为大家详细介绍了C语言实现数独游戏的求解,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C语言实现输入ascii码,输出对应的字符方式

    C语言实现输入ascii码,输出对应的字符方式

    这篇文章主要介绍了C语言实现输入ascii码,输出对应的字符方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C++实现简单的学生成绩管理系统

    C++实现简单的学生成绩管理系统

    这篇文章主要为大家详细介绍了C++实现简单的学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • c++ 解决无法打印uint8_t 类型变量的问题

    c++ 解决无法打印uint8_t 类型变量的问题

    这篇文章主要介绍了c++ 解决无法打印uint8_t 类型变量的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C++使用ffmpeg实现rtsp取流的代码

    C++使用ffmpeg实现rtsp取流的代码

    这篇文章主要介绍了C++使用ffmpeg实现rtsp取流,文章介绍了ffmepg采用rtsp取流流程图,CMakeLists.txt编写方法,通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04

最新评论