QT C++ QtConcurrent::run 异步任务 简单例子
QtConcurrent命名空间提供了高级API,使得无需使用低级线程原语即可编写多线程程序。
QtConcurrent::run是Qt框架中用于简化并发编程的一个功能,主要用于在后台线程中异步执行函数或成员函数。其主要用途包括:
- 异步执行函数:
QtConcurrent::run
可以在一个单独的线程中运行一个函数,避免耗时操作阻塞当前线程。这对于提升应用程序的响应性和性能非常有帮助。 - 简化多线程编程:通过使用
QtConcurrent::run
,开发者可以避免直接处理线程的创建、管理和数据同步等复杂操作。这使得编写多线程代码变得更加简单和直观。 - 利用多核处理器能力:
QtConcurrent
模块能够根据计算机的CPU核心数自动调整运行的线程数目,从而充分利用多核处理器的计算能力。
使用方法
使用QtConcurrent::run
的基本步骤如下:
- 包含必要的头文件:在代码中包含
#include <QtConcurrent>
。 - 调用
QtConcurrent::run
:使用QtConcurrent::run
函数,可以传递一个函数或成员函数及其参数。该函数将在后台线程中异步执行。 - 获取结果:可以通过
QFuture
对象获取异步操作的结果。如果需要等待操作完成,可以使用QFutureWatcher
来监控和同步结果。
以下是例子,在界面上拖放了一个按钮btn1,在按钮Click程序中试验。
1.头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtConcurrent>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_btn1_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
2.cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btn1_clicked()
{
// QThread::msleep(5000);//这行会卡死界面,不能拖动
//下面的程序不会卡死界面,放入了lambda函数
QtConcurrent::run(
[ ]()//以下三行是lambda函数,可以用其它函数替代
{
QThread::msleep(5000);
}
);
//以上的 QtConcurrent::run程序和下面几行是等价的
QtConcurrent::run(QThreadPool::globalInstance(),
[ ]()
{
QThread::msleep(5000);
}
);
}