提交 e5776b83 编写于 作者: mahuifa's avatar mahuifa

feat:增加QtConcurrent::mapped使用示例

    在mapped中异步计算多个0~n的数的和,并通过返回值传递出来。
上级 57a3bb17
#---------------------------------------------------------------------------------------
# @功能: QtConcurrent::mapped使用示例,与 map() 类似,不同之处在于它返回了一个包含返回值的新容器。
# @编译器: Desktop Qt 5.12.5 MSVC2017 64bit(也支持其它编译器)
# @Qt IDE D:/Qt/Qt5.12.5/Tools/QtCreator/share/qtcreator
#
# @开发者 mhf
# @邮箱 1603291350@qq.com
# @时间 2023-03-08 19:56:37
# @备注 mapped中异步计算多个0~n的数的和,并通过返回值传递出来。
#---------------------------------------------------------------------------------------
QT += core gui concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
widget.cpp
HEADERS += widget.h
FORMS += widget.ui
# 定义程序版本号
VERSION = 1.0.0
DEFINES += APP_VERSION=\\\"$$VERSION\\\"
contains(QT_ARCH, i386){ # 使用32位编译器
DESTDIR = $$PWD/../bin # 程序输出路径
}else{
DESTDIR = $$PWD/../bin64 # 使用64位编译器
}
# msvc >= 2017 编译器使用utf-8编码
msvc {
greaterThan(QMAKE_MSC_VER, 1900){ # msvc编译器版本大于2015
QMAKE_CFLAGS += /utf-8
QMAKE_CXXFLAGS += /utf-8
}else{
message(msvc2015及以下版本在代码中使用pragma execution_character_set("utf-8")】指定编码)
}
}
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
#include "widget.h"
#include "ui_widget.h"
#include <qthread.h>
#include <qtconcurrentmap.h>
#include <qthread.h>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle(QString("QtConcurrent::mapped使用示例--V%1").arg(APP_VERSION));
for(int i = 10; i < 20; i++)
{
m_maxs.append(i);
}
connect(&m_futureWatcher, &QFutureWatcher<quint64>::started, [](){qDebug() << "开始监测";});
connect(&m_futureWatcher, &QFutureWatcher<quint64>::finished, [&]()
{
qDebug() << "执行完成";
});
connect(&m_futureWatcher, &QFutureWatcher<quint64>::progressRangeChanged, [](int minimum, int maximum) // 进度范围改变时触发信号
{
qDebug() << QString("进度范围[%1,%2]").arg(minimum).arg(maximum);
});
connect(&m_futureWatcher, &QFutureWatcher<quint64>::progressValueChanged, ui->progressBar, &QProgressBar::setValue); // 进度改变时触发信号(会限制进度信号发射速率,可能无法接收到所有进度)
connect(&m_futureWatcher, &QFutureWatcher<quint64>::progressRangeChanged, ui->progressBar, &QProgressBar::setRange);
connect(&m_futureWatcher, &QFutureWatcher<quint64>::resultReadyAt, this, &Widget::on_resultReadyAt); // 当有返回值时触发这个信号
}
Widget::~Widget()
{
delete ui;
}
/**
* @brief 在线程中异步计算数据,并返回计算的结果
* @param max
* @return
*/
quint64 sum(int max)
{
qDebug() << QString("开始计算从0~%1的和,线程:").arg(max) << QThread::currentThreadId();
quint64 sum = 0;
for(int i = 0; i < max; i++)
{
sum += i;
QThread::msleep(100);
}
return sum;
}
/**
* @brief 获取异步计算的返回值
* @param resultIndex
*/
void Widget::on_resultReadyAt(int resultIndex)
{
QString str = QString("计算0~%1的和:%2").arg(m_maxs.at(resultIndex)).arg(m_futureWatcher.resultAt(resultIndex));
ui->textEdit->append(str);
}
/**
* @brief 开始在线程中异步计算数据
*/
void Widget::on_pushButton_clicked()
{
if(m_futureWatcher.isRunning()) // 判断是否正在运行
{
m_futureWatcher.cancel(); // 取消还没开始的异步任务,已经开始的不会发送进度和结果就绪信号
m_futureWatcher.waitForFinished(); // 等待已经开始的异步任务完成
return;
}
m_futureWatcher.setFuture(QtConcurrent::mapped(m_maxs, sum));
}
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <qfuturewatcher.h>
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_resultReadyAt(int resultIndex);
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QFutureWatcher<quint64> m_futureWatcher;
QList<int> m_maxs;
};
#endif // WIDGET_H
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Widget</class>
<widget class="QWidget" name="Widget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>487</width>
<height>362</height>
</rect>
</property>
<property name="windowTitle">
<string>Widget</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QTextEdit" name="textEdit">
<property name="font">
<font>
<family>黑体</family>
<pointsize>14</pointsize>
</font>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QProgressBar" name="progressBar">
<property name="value">
<number>24</number>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
......@@ -14,3 +14,4 @@ TEMPLATE = subdirs
SUBDIRS += RunFunction # QtConcurrent::run使用示例,在另一个线程中运行一个函数。
SUBDIRS += Map # QtConcurrent::map使用示例,可以在多线程环境下高效地处理大量数据,并且可以返回一个QFuture对象,可以使用它来跟踪数据处理的进度。
SUBDIRS += Mapped # QtConcurrent::mapped使用示例,与 map() 类似,不同之处在于它返回了一个包含返回值的新容器。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册