zoukankan      html  css  js  c++  java
  • Qt多线程应用--QRunnable

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

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

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

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

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

    main.cpp

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

    runnableInst.h

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

    runnableInst.cpp

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

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

     

     
  • 相关阅读:
    JQuery的学习笔记
    Ajax的学习笔记
    软件项目的托管平台gitHub
    滚动事件:document.body.scrollTop总是0的原因
    Less/Sass编译工具,koala使用指南
    CSS中的浮动和清除浮动,梳理一下
    PHP_GET数据获取
    php中header()
    服务端web开发:PHP简介以及常见语法
    C/S架构和B/S架构
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3758146.html
Copyright © 2011-2022 走看看