QFuture<T>run(constClass

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

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

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

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

void thread_add(QObject*receiver,inta,intb)

{
    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重新实现boolMainWindow::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:
publicQEvent

{
    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;
};

最新文章

  1. RAC textView的双向绑定
  2. [LeetCode] 3Sum Smaller 三数之和较小值
  3. Qt 获取本机ip地址  【转自 CSDN jpchen609
  4. IIS发布项目 遇到的error
  5. xstream对象xml互转
  6. org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.entity.annotations.House.district in
  7. 使用 dom4j 处理 xml (2)
  8. MySQL必知必会第十一章-
  9. 前后端分离springmvc和RESTful理解
  10. Spring Boot 2.0尝鲜-动态 Banner
  11. XML基础入门
  12. VS 代码整理插件推荐:CodeMaid
  13. 在Mac上配置全局的Git忽略文件
  14. GRYZ 模 拟 赛 系 列 Xxy 的车厢调度
  15. fork(), waitpid()
  16. 一起做RGB-D SLAM (2)
  17. webstorm的个性化设置settings
  18. MVC与MVVM设计模式理解
  19. [转]How to log queries using Entity Framework 7?
  20. Python rest-framework 中类的继承关系(as_view)

热门文章

  1. 【Linux】【sendmail】利用sendmail发送带附件的邮件及解决邮件中文标题乱码
  2. The First Scrum Meeting!
  3. vue登录页和主页路由配置问题
  4. 一些idea
  5. python的OS模块生成100个txt文件
  6. leetcode上的一些栈、队列问题
  7. USB编程概念
  8. Openstack组件部署 — Keystone功能介绍与认证实现流程
  9. Android 发布自动版本号方案
  10. 判断是否英文字母或数字的C#正则表达式