• 若在Qt准备使用线程类一般有两种方式(1) 采用WorkObject配合QThread进行使用 (2)继承QThread, 重载run()函数即可。
  • 注:采用Qt::Concurrent之类的不在本文讨论范围内.

  方式一、采用WorkObject配合QThread进行使用

  1. 创建一个用于计算的对象,该对象的运算相关函数防止在public slots 下:

     //..Object.h
     class CObject : public QObject
     {
         Q_OBJECT
     public:
         explicit CObject(QObject *parent = 0);
         ~CObject();
    
     signals:
         void sigFinish(const QString &s); //跨线程请注意使用const
    
     public slots:
         void Run();
         void Stop();
    
     private:
         bool m_bStop;
     };
    
     //..Object.cpp
     CObject::CObject(QObject *parent)
         : QObject(parent),m_bStop(false)
     {
    
     }
    
     void CObject::Run()
     {
         int i = 0;
         while(1)
         {
             if(m_bStop)
             {
                 return;
             }
             qDebug()<<"Object TheradID = "<<QThread::currentThreadId();
             qDebug()<<"Run i = "<<i;
             sleep(1);
             if(++i == 10)
             {
                 emit sigFinish("Finish");//信号是线程安全的,当然这得扯到后面的连接方式
             }
         }
     }
    
     void CObject::Stop()
     {
         m_bStop = true;
         emit sigFinish("Stop");//!!按照需求添加
     }
  2. 创建一个测试对象CTest
     //..test.h
     class CTest : public QObject
     {
         Q_OBJECT
     public:
         explicit CTest(QObject *parent = 0);
         void Run();
         void Stop();
    
     signals:
    
     private slots:
         void slotFinish(const QString &);
    
     private:
         QList<CObject *> m_ListObj;
     };
    
     //..test.cpp
     CTest::CTest(QObject *parent) : QObject(parent)
     {
    
     }
    
     void CTest::Run()
     {
         QThread *pThread = new QThread(this); // 只充当一个作为另个线程的入口
         CObject *pObj = new CObject; //注意:moveToThread不能使用在双亲对象上
         m_ListObj.append(pObj);
    
         qDebug()<<"Current Main Run Thread = "<<QThread::currentThreadId();
    
         connect(pObj,SIGNAL(sigFinish(QString)),pObj,SLOT(deleteLater()));
         connect(pObj,SIGNAL(sigFinish(QString)),pThread,SLOT(quit()));
         connect(pObj,SIGNAL(sigFinish(QString)),this,SLOT(slotFinish(QString)));
    
         connect(pThread,SIGNAL(started()),pObj,SLOT(Run()));
         connect(pThread,SIGNAL(finished()),pObj,SLOT(deleteLater()));
    
          pObj->moveToThread(pThread);
    
         pThread->start();
     }
     void CTest::Stop()
     {
         foreach (CObject *pObj, m_ListObj)
         {
             if(!QMetaObject::invokeMethod(pObj,"Stop",Qt::DirectConnection))//!!留个坑,为什么autoConnection会没反应
             {
                 qDebug()<<"error";
             }
         }
         m_ListObj.clear();
     }
    
     void CTest::slotFinish(const QString &s)
     {
         qDebug()<<"Main Thread Receive:"<<s;
     }
  3. main.cpp
     //..main.cpp
     int main(int argc, char *argv[])
     {
         QCoreApplication a(argc, argv);
         CTest test;
         test.Run();
         sleep(5);
         test.Stop();
         return a.exec();
     }
  4. 执行结果

  

  Well Done,方式2见Qt线程(2) QThread中使用WorkObject?

Qt线程(1) moveToThread的更多相关文章

  1. Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)

    Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...

  2. Qt——线程与定时器

    一.定时器QTimer类 The QTimer class provides repetitive and single-shot timers. The QTimer class provides ...

  3. Qt 线程基础(QThread、QtConcurrent等)

    [-] 使用线程 何时使用其他技术替代线程 应该使用 Qt 线程的哪种技术 Qt线程基础 QObject与线程 使用互斥量保护数据的完整 使用事件循环防止数据破坏 处理异步执行 昨晚看Qt的Manua ...

  4. Qt 线程基础

    (转自:http://my.oschina.net/laopiao/blog/88158) 何谓线程? 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据 ...

  5. QT线程使用收集示例

    关于多线程问题: Qt和Boost做跨平台的线程封装,OpenMP主要做并行计算,让不精通多线程的人也能高效地利用CPU的计算能力.个人倾向于用boost.thread, boost.mpi.   一 ...

  6. Qt 线程基础(QThread、QtConcurrent等) 2

    使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线 ...

  7. Qt 线程基础(QThread、QtConcurrent、QThreadPool等)

      使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使 ...

  8. Qt线程(2) QThread中使用WorkObject

    一般继承QThread的WorkThread都会在重载的run()中创建临时的WorkObject,这样能确定这个WorkObject在该thread中使用 那如果这个WorkObject是个Sing ...

  9. 详解 Qt 线程间共享数据(用信号槽方式)

    使用共享内存.即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的. Qt 线程间共享数据是本文介绍的内容,多的不说,先来啃内容.Qt线程间共享 ...

随机推荐

  1. 实验五 cmp传输与加解密

    ---恢复内容开始--- (一)实验内容 1.运行TCP代码,一人服务器,一人客户端 2.下载加解密代码,先编译运行代码,一人加密一人解密. 3.集成代码,一人加密后通过TCP 发送,加密使用DES或 ...

  2. 让Windows下的Tomcat将控制台信息记录到日志

    在开发的过程中经常出现包冲突,却不知道怎么回事,可以在 catalina.bat 里面设置查看class加载日志   set CATALINA_OPTS=-server -Xdebug -Xnoage ...

  3. 使用MediaPlayer播放音频-----之二

    MediaPlayer播放不同来源的音频文件: 一.播放应用的资源文件 1.调用MediaPlayer的create(Context  context , int  resid)方法加载指定资源文件. ...

  4. NSString asscii格式(2进制) 转 utf8格式——解决iOS自己处理http socket数据,遇到Transfer-Encoding: chunked时

    因为需要实现自己的http客户端,就要自己模拟http 的socket通讯: 上行不难,自己处理好http即可. 但下行时,服务器端的动态语言返回数据有可能会是这种格式: http头 16进制表示的数 ...

  5. hdu 4605 Magic Ball Game

    http://acm.hdu.edu.cn/showproblem.php?pid=4605 可以离线求解 把所以可能出现的 magic ball  放在一个数组里(去重),从小到大排列 先不考虑特殊 ...

  6. js unix时间戳转换

    一.unix时间戳转普通时间: var unixtime=1358932051; var unixTimestamp = new Date(unixtime* 1000); commonTime = ...

  7. Win7 Print Spooler服務自动关闭

    对于Win7系统而言,该问题通常是安装了错误的打印驱动引起的,Win7系统为了保护其它进程不受干扰,自动关闭了打印服务. 解决方法就是: a> 把不用的打印机删掉. b> 确保你安装了正确 ...

  8. java 基本类库包的作用

    tools.jar:工具类库,它跟我们程序中用到的基础类库没有关系. Jre库包含的jar文件(jdk1.6):resources.jar.rt.jar.jsse.jar.jce.jar.charse ...

  9. 【参考文献1】Word2010删除引用参考文献留下的横线

    那个莫名其妙不能选中,相信你也遇到.如果是这样,可能那个是尾注分隔符.你可以按照本文的方法解决.当然啦,这个也是按照网上的方法整理参考文献会留下的直线 Office Word2010 方法/步骤   ...

  10. hql语句理解2

    /* * this.getSession().createQuery("sdfdf").executeUpdate();这里面的query可以是delete,update,inse ...