在日常生活中,一个人在做事的时候,总是按照一定的先后顺序依次进行,这种可以简称为同步操作;
当我们有多个人一起干活时,那么不同的人可以在同一时间同时做不同的事情,这种可以简称为异步;
当有多件事情和多个人时,而每个人均可以做多件事情里面的任何一件,若此时让很多人在一定的事件内让大家一起随机去做某件事,那么这种便可以成为并发。
以上是日常生活中的例子,那么接下来我们从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()));
}
运行效果:
并发的示例: 使用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;
}
下一篇博客:
上一篇博客: