QtConcurrent

2024-06-08 02:18
文章标签 qtconcurrent

本文主要是介绍QtConcurrent,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



QFuture<T> run(const Class *object, T (Class::*fn)(Param1, Param2, Param3, Param4, Param5) const, constArg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)

run()函数的原型如上,此函数是QtConcurrent命名空间里的函数.主要功能是令启动一个线程来执行一个函数.Concurrent的英文示意就是并发的意思.

下面简要的介绍run()函数的使用方法:

1.首先要有一个需要在另外开启的线程中执行的函数:

void thread_add(QObject *receiver,int a,int b)

{
    QString message=QString("%1 + %2 = %3").arg(a).arg(b).arg(a+b);
 
    QApplication::postEvent(receiver,new ProgressEvent(true, message));
 
}

函数在线程中运行完毕后会向receiver发送一个消息,来返回结果.

 

2.有了要在线程中运行的函数,再来看看怎么启动线程来运行这个函数

void MainWindow::on_pushButton_clicked()

{
    for(int i=0;i<9;i++)
        for(int j=0;j<9;j++)
 
    QtConcurrent::run(thread_add,this,i,j);
 
}

点击一个按钮就会运行这段代码,然后启动8*8=64个线程,线程要运行的函数就是thread_add(之前定义的),消息接收对象就是MainWindow这个类的实例

 

3.线程得到了运行会发送消息给MainWindow,MainWindow重新实现bool MainWindow::event ( QEvent * event )处理接收到的消息,并显示出来

bool MainWindow::event ( QEvent * event )

{
    if (event->type() ==
            static_cast<QEvent::Type>(ProgressEvent::EventId)) {
        ProgressEvent *progressEvent =
                static_cast<ProgressEvent*>(event);
        Q_ASSERT(progressEvent);
        ui->teLog->append(progressEvent->message);
        return true;
    }
    return QMainWindow::event(event);
 
}

 

再给出自定义的消息结构

struct ProgressEvent : public QEvent

{
    enum {EventId = QEvent::User};
 
    explicit ProgressEvent(bool saved_, const QString &message_)
        : QEvent(static_cast<Type>(EventId)),
          saved(saved_), message(message_) {}
 
    const bool saved;
    const QString message;
};

 




这篇关于QtConcurrent的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040960

相关文章

QT---QtConcurrent---Run

1.QtConcurrent QtConcurrent 是命名空间 (namespace),它提供了高层次的函数接口 (APIs),可根据计算机的 CPU 核数,自动调整运行的线程数目。 模块:concurrent 2.run() QFuture<T> run(Function, ...) Function 必须是指向函数的指针,函数返回T型对象。省略号代表变量参数列表,如果给出参数,这

[Qt5] 使用QtConcurrent::run在异步线程中执行耗时函数

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨ 文章预览: 一. QtConcurrent::run异步线程操作 一. QtConcurrent::run异步线程操作

深入理解Qt多线程编程(QtConcurrent)

多线程编程在现代软件开发中变得越来越重要,它能够提高应用程序的响应速度和处理性能。在Qt框架中,除了QThreadPool,QtConcurrent也是一个强大的工具,用于简化和管理多线程编程。 目录 概述接口详解 QtConcurrent::runQtConcurrent::mapQtConcurrent::mappedQtConcurrent::filter和filteredQtConc

Qt -线程基础(QThread、QtConcurrent、信号槽等)

昨晚看Qt的Manual,突然发现下一个版本的Qt中(Qt4.7.4、Qt4.8等)增加了一个特赞的介绍多线程的文章 : Thread Basics 注意: 该链接以后会失效,但是 到时候你直接看Qt自带Manual就行了本文不是严格的翻译 dbzhang800 2011.06.18 使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快。为保持GUI线程或其他

qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面

qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面 code review! 参考博文: qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面 qt-C++笔记之QThread使用 文章目录 qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面1.QtConcurrent::r

QtConcurrent::run操作界面ui的注意事项(2)

前面的“QtConcurrent::run操作界面ui的注意事项(1)”,末尾说了跨线程的问题,引出了Qt千好万好,就是跨线程不好。下面是认为的最简单的解决办法:使用QMetaObject::invokeMethod(相比较信号-槽),直接看源程序: // h 头文件中定义public:Q_INVOKABLE void updateLabel(QString str); //必须添加Q_INV

QtConcurrent::run操作界面ui的注意事项(1)

先说结论:QtConcurrent::run启动的耗时处理函数,不允许处理ui界面对象,如控件,如进度条等等! QtConcurrent::run非常好用,胜过QThead的两种方式(run和moveToThread),例如下面是非常直观和简单的使用方式: QT += concurrent#include <QtConcurrent>#include <QThread>void MainWi

QtConcurrent::run操作界面ui的注意事项

先说结论:QtConcurrent::run启动的耗时处理函数,不允许处理ui界面对象,如控件,如进度条等等! QtConcurrent::run非常好用,胜过QThead的两种方式(run和moveToThread),例如下面是非常直观和简单的使用方式: QT += concurrent#include <QtConcurrent>#include <QThread>void MainWi

【QT进阶】Qt线程与并发之QtConcurrent返回值与run方法的参数说明

往期回顾 【QT进阶】Qt线程与并发之线程和并发的简单介绍-CSDN博客 【QT进阶】Qt线程与并发之创建线程的三种方法(超详细介绍)-CSDN博客 【QT进阶】Qt线程与并发之QtConcurrent的简单介绍-CSDN博客  【QT进阶】Qt线程与并发之QtConcurrent返回值与run方法的参数说明 一、QtConcurrent::run的参数说明 QtConcurrent

QtConcurrent的基础用法map,mapped,mappedReduced

实际上应该说多线程让QtConcurrent实现了并行可能更准确点。不然map函数就不好理解了。那么QtConcurrent的map函数又有什么用呢?这就要先看看map的参数了。map函数有两个参数,第一个是序列(如QList),第二个参数是一个函数。它的作用就是同时用第二个参数来计算第一个参数中的每一个元素,且结果直接覆盖到元素中。          如QtConcurrent::map传入