【QT进阶】Qt线程与并发之QtConcurrent的简单介绍

往期回顾

【QT进阶】Qt http编程之实现websocket client客户端-CSDN博客

【QT进阶】Qt线程与并发之线程和并发的简单介绍-CSDN博客

【QT进阶】Qt线程与并发之创建线程的三种方法(超详细介绍)-CSDN博客

【QT进阶】Qt线程与并发之QtConcurrent的简单介绍

一、QtConcurrent简单介绍

1、什么是QtConcurrent

QtConcurrent是Qt框架中的一个模块,是一个强大且易于使用的并发编程工具,用于简化并发编程。它提供了一组高级API,使得在多线程环境下执行并行任务变得更加容易。

QtConcurrent模块旨在简化并发编程,通过QtConcurrent可以让我们更好的利用多核处理器的性能优势,实现高效的并行计算和任务执行。通过QtConcurrent,我们可以更轻松地编写并发代码,而不必担心底层线程管理的复杂性。

2、主要特点和功能

|-------------|-------------------------------------------------------------------------|
| 简化并发编程: | QtConcurrent提供了一组高级函数和类,使并发编程变得更加容易。开发人员可以使用这些函数来并行执行任务,而无需处理底层线程管理细节。 |
| 任务执行: | QtConcurrent支持多种任务执行模式,包括map-reduce、过滤、映射等。开发人员可以选择适合其需求的任务执行模式来实现并行计算。 |
| 线程管理: | QtConcurrent会自动管理线程池,开发人员无需手动创建和管理线程。这简化了多线程编程,并提高了应用程序的性能和响应性。 |
| 异步执行: | QtConcurrent还支持异步执行任务,使得在后台执行耗时任务成为可能,而不会阻塞应用程序的主线程。 |
| 方便的API: | QtConcurrent提供了易于使用的API,开发人员可以轻松地将现有的函数或Lambda表达式并行化,从而利用多核处理器的性能优势。 |

二、示例说明

1、包含相关头文件和模块

复制代码
Header: #include <QtConcurrent>
qmake: QT += concurrent
Since: Qt 4.4

2、示例

这个示例里,如果我在按钮的槽函数里直接调用timeTask()方法,大量的输入输出也会导致窗口卡顿,但是如果我用并发,就完全没问题 。

2.1concurrent.h

复制代码
#pragma once

#include <QtWidgets/QWidget>
#include "ui_concurrent.h"

class concurrent : public QWidget
{
    Q_OBJECT

public:
    concurrent(QWidget *parent = nullptr);
    ~concurrent();

    int timeTask();

private slots:
    void on_pushButton_clicked();

private:
    Ui::concurrentClass ui;
};
2.2concurrent.cpp
复制代码
#include "concurrent.h"
#include <QThread>
#include <QDebug>
#include <QtConcurrent>
#include <QFuture>

concurrent::concurrent(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
}

concurrent::~concurrent()
{}

int concurrent::timeTask()
{
    int num = 0;
    for (int i = 0; i < 1000000; i++)
    {
        num++;
        qDebug() << num;
    }

    return num;
}

void concurrent::on_pushButton_clicked()
{
    //timeTask();

    QFuture<int> ft = QtConcurrent::run(this, &concurrent::timeTask);

    while (!ft.isFinished())
    {
        //当future未完成时,让cpu去 做别的事情
        QApplication::processEvents(QEventLoop::AllEvents, 30);
    }
}

通过使用 QtConcurrent::run 函数,将 timeTask 函数放在了一个新的线程中执行,这样主线程不会被阻塞,可以继续响应用户输入和刷新界面,保持界面的流畅性。

同时,我们还在 on_pushButton_clicked 槽函数中使用了一个循环来等待新线程的执行完成,通过不断处理事件保证界面的响应性。


以上就是QtConcurrent的简单介绍。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner12 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner13 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00615 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术15 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript