http://blog.csdn.net/lefttime/article/details/5717349

作为Qt类中少有的基类, QRunnable提供了简洁有效的可运行对象的创建.  用QRunnable来创建独立的运行对象来运行 不涉及界面元素的数据处理过程 非常合适.

优点: 创建过程简洁, 使用方便, 配合着自身的autoDelete特性, 有点“招之即来, 挥之即去”的感觉.

缺点: 无法实时提供自身的运行状态.

举个处理过程中反馈进度的例子

main.cpp

  1. #include <QApplication>
  2. #include <QProgressBar>
  3. #include <QThreadPool>
  4. #include "runnableInst.h"
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication app(argc, argv);
  8. QProgressBar progressBar;
  9. progressBar.setValue(50);
  10. progressBar.show();
  11. runnableInst* hInst = new runnableInst(&progressBar);
  12. QThreadPool::globalInstance()->start(hInst);
  13. return app.exec();
  14. }

runnableInst.h

  1. #ifndef RUNNABLEINST_H
  2. #define RUNNABLEINST_H
  3. #include <QRunnable>
  4. class QProgressBar;
  5. class runnableInst : public QRunnable
  6. {
  7. public:
  8. runnableInst(QProgressBar* progressBar);
  9. virtual ~runnableInst();
  10. void run();
  11. private:
  12. QProgressBar* m_ProgressBar;
  13. };
  14. #endif // RUNNABLEINST_H

runnableInst.cpp

  1. #include "runnableInst.h"
  2. #include <QTest>
  3. #include <QProgressBar>
  4. runnableInst::runnableInst(QProgressBar* progressBar)
  5. : QRunnable(), m_ProgressBar(progressBar)
  6. {
  7. }
  8. runnableInst::~runnableInst()
  9. {
  10. }
  11. void runnableInst::run()
  12. {
  13. for(int step = 1; step <= 100; step++)
  14. {
  15. // 处理数据过程
  16. //...
  17. // 这两句只是测试用, 针对不同的环境可采用相应的进度反馈
  18. QMetaObject::invokeMethod(m_ProgressBar, "setValue", Q_ARG(int, step));
  19. QTest::qSleep(100);
  20. //...
  21. }
  22. }

当QRunnable运行结束, 它自身会被销毁, 所以用不着担心内存泄露(除了指定设置setAutoDelete(false)); 不过要注意在数据或事件对象的处理~` 好比例子中QMetaObject::invokeMethod是比较危险的事!

 

Qt多线程应用--QRunnable的更多相关文章

  1. Qt多线程-QThreadPool线程池与QRunnable

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThreadPool线程池与QRunnable     本文地址:https:/ ...

  2. Qt多线程-总结QThread-QThreadPool-QtConcurrent

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-总结QThread-QThreadPool-QtConcurrent     本文 ...

  3. SeetaFaceQt:Qt多线程

    为什么要做多线程,说个最简单的道理就是我们不希望在软件处理数据的时候界面处于无法响应的假死状态.有些处理是灰常花时间的,如果把这样的处理放到主线程中执行,就会导致软件一条路走到底,要等到处理完才能接收 ...

  4. 【QT】 Qt多线程的“那些事”

    目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...

  5. 1.QT多线程使用小结

    开头 一个进程可以有一个或更多线程同时运行.线程可以看做是"轻量级进程",进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理. Qt 使用QThread来管理线 ...

  6. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  7. [转] Qt 多线程学习

    Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...

  8. QT多线程笔记

    1.QT多线程涉及到主线程和子线程之间交互大量数据的时候,使用QThread并不方便,因为run()函数本身不能接受任何参数,因此只能通过信号和槽的交互来获取数据,如果只是单方面简单交互数据还过得去, ...

  9. Qt多线程-QtConcurrent并行运算高级API

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QtConcurrent并行运算高级API     本文地址:http://tec ...

随机推荐

  1. 2017JAVA面试题附答案

    JAVA基础 JAVA中的几种基本类型,各占用多少字节?   String能被继承吗?为什么? 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变.平 ...

  2. Hadoop_18_MapRduce 内部的shuffle机制

    1.Mapreduce的shuffle机制: Mapreduce中,map阶段处理的数据如何传递给Reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle 将mapta ...

  3. SSH环境搭建之Spring环境搭建篇

    SSH环境搭建之Spring环境搭建篇 一.引入Spring所使用的JAR文件 二.在src目录下创建beans.xml(Spring的容器文件) <?xml version="1.0 ...

  4. Java&Selenium&TestNG&ZTestReport 自动化测试并生成HTML自动化测试报告

    一.摘要 本篇博文将介绍如何借助ZTestReport和HTML模版,生成HTML测试报告的ZTestReport 源码Clone地址为 https://github.com/zhangfei1984 ...

  5. MySQL JSON类型

    MySQL支持JSON数据类型.相比于Json格式的字符串类型,JSON数据类型的优势有: 存储在JSON列中的JSON文档的会被自动验证.无效的文档会产生错误: 最佳存储格式.存储在JSON列中的J ...

  6. 记一次基于 mpvue 的小程序开发及上线实战

    小程序名称:一起打车吧 项目地址: 客户端:https://github.com/jrainlau/taxi-together-client 服务端:https://github.com/jrainl ...

  7. Redis五种数据结构(二)

    Redis数据结构 Redis数据结构介绍 Redis是一种高级的key-value的存储系统,其中value支持五种数据类型. 字符串(String) 哈希(hash) 字符串列表(list) 字符 ...

  8. MySQL基准测试和sysbench工具

    参考https://www.cnblogs.com/kismetv/archive/2017/09/30/7615738.html 一.基准测试的作用 sysbench是一个开源的.模块化的.跨平台的 ...

  9. SendMessage到底是如何工作的?

    以下内容摘自<<Windows核心编程>>: 概要: SendMessage对于在同一个线程中调用的话,直接调用的是当前线程所属窗口的窗口过程函数(WndProc);如果是跨线 ...

  10. struts2编写表单提交简单的(2)

    实体 package com.oak.entity; public class User {private int id;private String username;private String ...