Qt6教程之三(10) 异步与并发编程

在日常生活中,一个人在做事的时候,总是按照一定的先后顺序依次进行,这种可以简称为同步操作;

当我们有多个人一起干活时,那么不同的人可以在同一时间同时做不同的事情,这种可以简称为异步;

当有多件事情和多个人时,而每个人均可以做多件事情里面的任何一件,若此时让很多人在一定的事件内让大家一起随机去做某件事,那么这种便可以成为并发。

以上是日常生活中的例子,那么接下来我们从1计算机的角度来阐述一下异步与并发的概念。

另外异步与并发是以计算机硬件作为基础的,只有具备多个CPU核心的电脑才真正拥有异步与并发的能力。

异步: 指程序控制电脑多个核心在相同的时间内几乎同时完成不同的任务,类似生活中多个人同时干活;

并发:相同时刻内程序控制电脑多个核心同时工作,类似生活中指挥多个运动员一起开跑;

在实际开发中,异步和并发均指线程层面的应用,其根本目的都是为了提高程序的执行效率和良好的用户体验。进程层面的通常是由操作系统来完成,开发人员通常是对系统提供的API进行二次封装后来操作进程。

接下来我们写两个示例程序进行演示异步与并发。

异步示例: 建立三个线程,第一个线程完成打印作业,第二个线程完成计数功能,第三个线程显示进度,最后三个线程把结果反馈给主线程更新界面。

关键代码:

#include "mainwindow.h"
#include "./ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    task1=new task_1;
    task2=new task_2;
    task3=new task_3;

    timer=new QTimer(this);
    timer->start(500);

    ThreadPool = QThreadPool::globalInstance();
    ThreadPool->setMaxThreadCount(10);
    ThreadPool->start(task1);
    ThreadPool->start(task2);
    ThreadPool->start(task3);

    connect(task1,SIGNAL(print(QString)),ui->textEdit,SLOT(append(QString)));
    connect(task2,SIGNAL(dialValue(int)),ui->lcdNumber,SLOT(display(int)));
    connect(task3,SIGNAL(valueChange(int)),ui->progressBar,SLOT(setValue(int)));

    connect(timer,SIGNAL(timeout()),this,SLOT(threadCount()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::threadCount()
{
     ui->statusbar->showMessage("current activity thread count is:" +QString::number(ThreadPool->activeThreadCount()));
}

运行效果:

完整工程文件如下:
https://download.csdn.net/download/XiaoWang_csdn/87607805https://download.csdn.net/download/XiaoWang_csdn/87607805

并发的示例:  使用QtConcurrent实现同步计算和打印字符串功能。

#include "mainwindow.h"
#include "./ui_mainwindow.h"

#include <QThread>
#include <QThread>
#include<QtConcurrent>


extern void test(){
    while (true) {
        QThread::msleep(1000);
        qDebug()<<"hello world!";
    }

}

extern int sum(int a,int b){
    b=a*a+b;
    a=b*a+a;

    return a+b;
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->progressBar->setRange(0,100);

   auto localRun = QtConcurrent::run(test);
   QFuture<int> result= QtConcurrent::run(sum,int(100),int(99));


   int re=result.result();
   qDebug()<<re;

   localRun.waitForFinished();
   result.waitForFinished();


}

MainWindow::~MainWindow()
{
    delete ui;
}

下一篇博客:

Qt6教程之三(11) 内存分配和管理_折腾猿王申兵的博客-CSDN博客本篇博客主要介绍内存分配与管理!https://blog.csdn.net/XiaoWang_csdn/article/details/129732166

上一篇博客:

Qt6教程之三(9) 多线程、线程间通讯、线程调度_折腾猿王申兵的博客-CSDN博客本篇博客主要讲解Qt中多线程的使用!https://blog.csdn.net/XiaoWang_csdn/article/details/129697936

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code_shenbing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值