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

目录
  • 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也会启用多核。

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();

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

(0)

相关推荐

  • Qt 自定义属性Q_PROPERTY不显示float类型的解决

    目录 Qt 自定义属性Q_PROPERTY不显示float类型 Qt 自定义属性Q_PROPERTY 下面是一些典型的声明属性的示例 Demo Qt 自定义属性Q_PROPERTY不显示float类型 最近在学习编写自定义控件,其中使用到Q_PROPERTY来设置自定义属性. 查阅资料可以知道,Q_PROPERTY支持的类型可以是QVariant支持的任一类型,又或者是我们自定义的类型,其他是可选的.设置完之后,会在调用自定义控件的时候,在属性编辑表里看到我们的属性.如下图 但是,今天在使用中发

  • QT中在QLabel显示图片并且利用鼠标点击画线问题

    目录 在QLabel显示图片并且利用鼠标点击画线 以下为我的代码,供参考 在QLabel显示图片并且利用鼠标点击画线 最近在做在Label上显示图片并且通过鼠标点击画线,在网上查了很多零零散散的东西,收获也多 很多初学者更希望直接贴代码,这样可以模仿来写,我下面直接贴出我的项目中自己写的maLabel类 (如果只是实现利用鼠标绘制, 重写void paintEvent(QPaintEvent *event);void mousePressEvent(QMouseEvent *e); void m

  • Qt如何自定义滑动条

    目录 先放效果图 1.头文件 2.声明 3.构造函数 4.设置样式表 5.重写鼠标点击事件 6.重写鼠标释放事件 7.绘制刻度 8.实际使用 最近要用到滑动条,Qt自带的QSlider虽然能满足需求,但是操作起来有很多不舒服的地方,于是在它的基础上改了改,分享给大家使用. 先放效果图 在QSlider的基础上,改变了样式,绘制了刻度,增加了取整功能,只需要微调就能适应各种需求. 1.头文件 需要包含下面的东西 #include <QSlider> #include <QtCore>

  • Qt中简单的按钮槽函数传递参数方法

    目录 Qt按钮槽函数传递参数方法 Qt槽函数的几种用法 通过ui控件添加槽函数 通过connect连接 Qt按钮槽函数传递参数方法 Qt中一个典型的点击按钮触发槽函数的写法是: connect(btn, &QPushButton::clicked, this, &class::func); 当你希望在点击按钮后再向槽函数中传递参数,这种写法就无法做到了. 其原因是槽函数要和信号的参数完全对应,如果修改了传给槽函数的参数,点击按钮的信号就无法处理. 这里给出一个比较简单的传参方法,在信号槽中

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

    目录 Qt简单的异步操作 Qt异步变同步问题 解决的问题 如何实现 代码块解析 Qt简单的异步操作 在实际应用中,经常会遇到一些耗时操作,导致了主线程的阻塞,这时候可以使用异步操作来避免阻塞. Qt的异步操作需要使用下面的库 #include <QtConcurrent/QtConcurrent> 然后将耗时操作丢进下面的函数中即可. QtConcurrent::run([=]()     {         func();     }); 如果需要判断耗时操作执行完毕与否,可以使用QFutu

  • 使用Python3+PyQT5+Pyserial 实现简单的串口工具方法

    练手项目,先上图 先实现一个简单的串口工具,为之后的上位机做准备 代码如下: github 下载地址 pyserial_demo.py import sys import serial import serial.tools.list_ports from PyQt5 import QtWidgets from PyQt5.QtWidgets import QMessageBox from PyQt5.QtCore import QTimer from ui_demo_1 import Ui_F

  • Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例

    Qt多线程 我们之前的程序都是单线程运行,接下来我们开始引入多线程.就相当于以前的一个人在工作,现在多个人一起工作. Qt中非常有必要使用多线程,这是因为,Qt应用是事件驱动型的,一旦某个事件处理函数处理时间过久,就会造成其它的事件得不到及时处理. Qt中使用QThread来管理线程,一个QThread对象,就是一个线程.QThread对象也有消息循序exec()函数,用来处理自己这个线程的事件. Qt实现多线程有两种方式 ​1.Qt第一种创建线程方式 首先要继承QThread 重写虚函数QTh

  • QT实现简单时钟效果

    本文实例为大家分享了QT实现简单时钟效果的具体代码,供大家参考,具体内容如下 先上效果图: 预备知识: 一.钟表实现原理 设置定时器timer,每隔1000毫秒(即1s)发送timeout()信号到槽函数update(),重绘事件函数paintEvent(QPaintEventevent) 二.钟表的绘制方法 拆分钟表:表盘 数字 刻度线 指针 paintEvent(QPaintEventevent) 1.设置定时器,时间间隔为1000毫秒,并且将定时器时间与update函数关联为信号和槽,定时

  • Qt创建并显示柱状图的方法

    创建一个简单的柱状图 第一步:创建一个QBarSet对象:QBarSet类代表条形图中的一组条形. QBarSet *set0 = new QBarSet("Jane"); QBarSet *set1 = new QBarSet("John"); QBarSet *set2 = new QBarSet("Axel"); QBarSet *set3 = new QBarSet("Mary"); QBarSet *set4 = n

  • Qt实现线程与定时器的方法

    目录 一.定时器QTimer类 二.在多线程中使用QTimer 1.错误用法 2.正确用法一 3.正确用法二 一.定时器QTimer类 The QTimer class provides repetitive and single-shot timers. The QTimer class provides a high-level programming interface for timers. To use it, create a QTimer, connect its timeout(

  • php简单复制文件的方法

    本文实例讲述了php简单复制文件的方法.分享给大家供大家参考,具体如下: <?php /** *author:果冻 *qq:52091199 *wyg517.blog.163.com **/ $file = 'image/a1.jpg'; $newfile = 'a/123.jpg'; //必须有写入权限 if (file_exists($file) == false) { die ('文件不在,无法复制'); } $result = copy($file, $newfile); if ($re

  • Python使用shelve模块实现简单数据存储的方法

    本文实例讲述了Python使用shelve模块实现简单数据存储的方法.分享给大家供大家参考.具体分析如下: Python的shelve模块提供了一种简单的数据存储方案,以dict(字典)的形式来操作数据. #!/usr/bin/python import sys, shelve def store_person(db): """ Query user for data and store it in the shelf object """ pi

  • python根据出生年份简单计算生肖的方法

    本文实例讲述了python根据出生年份简单计算生肖的方法.分享给大家供大家参考.具体分析如下: 这里使用python根据出生年份计算生肖,看了代码会发现原来这么简单 #计算生肖 def ChineseZodiac(year): return u'猴鸡狗猪鼠牛虎兔龙蛇马羊'[year%12] ChineseZodiac(1990) 希望本文所述对大家的Python程序设计有所帮助.

随机推荐