• 一般继承QThread的WorkThread都会在重载的run()中创建临时的WorkObject,这样能确定这个WorkObject在该thread中使用
  • 那如果这个WorkObject是个Singleton是种什么情况呢?

  方式2:在QThread中使用WorkObject

  1.创建WorkObject

 #include <QObject>
 #include <QDebug>
 #include <QThread>

 #define DEBUG(x) \
 {\
     qDebug()<<"class name:"<<x->metaObject()->className()<<"\n"\
     <<"function:"<<__func__<<"\n" \
     <<"thread id = "<<QThread::currentThreadId()  \
     <<"\n--------------------------------------------------"; \
 }\

 class WorkObject : public QObject
 {
     Q_OBJECT

 public:
     static WorkObject *getInstance()
     {
           static WorkObject instance;
           return &instance;
     }

     void start(){DEBUG(this);}

 private:
     Q_DISABLE_COPY(WorkObject)
     )
         :QObject(parent)
     {}
 };

  2.创建WorkThread

 #include <QThread>

 #include "workobject.h"

 class WorkThread : public QThread
 {
 public:
     WorkThread(QObject *parent = )
         :QThread(parent)
     {}

 protected:
     void run()
     {
         DEBUG(this);
         WorkObject *pWork = WorkObject::getInstance();
         pWork->start();
     }
 };

  3.创建ManagerObject

 #include <QObject>

 #include "workobject.h"
 #include "workthread.h"

 class ManagerObject : public QObject
 {
     Q_OBJECT
 public:
     )
         :QObject(parent)
     {}

     void start()
     {
         DEBUG(this);
         WorkObject *pObj = WorkObject::getInstance();
         pObj->start();
     }

     void threadRun()
     {
         DEBUG(this);
         WorkThread *pThread =new  WorkThread;
         pThread->start();
     }
 };

  4.main.cpp

 #include <QCoreApplication>
 #include <QDebug>

 #include "managerobject.h"
 #include "workthread.h"

 int main(int argc, char *argv[])
 {
     QCoreApplication a(argc, argv);

     qDebug()<<"main thread id = "<<QThread::currentThreadId()<<"\n";
     ManagerObject k;
     k.start();
     k.threadRun();

     //WorkThread *p = new WorkThread;
    // p->start();

     return a.exec();
 }

  5.运行结果

  

  • 因此这样应用Qt的多线程也可以,当然如果计算量不大或则觉得这样的方式比较麻烦的可以使用Qt::Concurrent.见Qt线程(3) Qt::Concurrent

  

Qt线程(2) QThread中使用WorkObject的更多相关文章

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

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

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

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

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

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

  4. Qt——线程类QThread

    本文主要介绍Qt中线程类QThread的用法,参考(翻译+修改)了一篇文章:PyQt: Threading Basics Tutorial,虽然使用的是PyQt,但与C++中Qt的用法大同小异,不必太 ...

  5. 【Qt开发】QThread中的互斥、读写锁、信号量、条件变量

    在gemfield的<从pthread到QThread>一文中我们了解了线程的基本使用,但是有一大部分的内容当时说要放到这片文章里讨论,那就是线程的同步问题.关于这个问题,gemfield ...

  6. Qt线程(1) moveToThread

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

  7. 重点:怎样正确的使用QThread类(很多详细例子的对比,注意:QThread 中所有实现的函数是被创建它的线程来调用的,不是在线程中)good

    背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...

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

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

  9. Qt 线程基础

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

随机推荐

  1. Masonry+拖动

    最近遇到一个问题,用Masonry写的布局: 拖动其中某个view,拖动方法按传统的写成如下形式.如果view中的label更改text值,拖动之后的view就会回到最初被设定的位置. - (void ...

  2. 【转载】C++中的位拷贝和值拷贝

    ---恢复内容开始--- 原文:C++中的位拷贝和值拷贝 原文:http://blog.csdn.net/liam1122/article/details/1966617 为了便于说明我们以Strin ...

  3. 【java】定时器

    总结 1.执行计划的任务放在TimerTask的子类中,由Timer进行该任务. 2.创建一个Timer就是启动一个新的线程,直至Timer里的任务执行完毕,才会结束.希望创建的线程为守护线程,则创建 ...

  4. javascript事件代理(Event Delegation)

    看了几篇文章,放上来供参考 司徒正美的文章,Event Delegation Made Easy --------------------------------------------------- ...

  5. linux top命令

    top命令参数 -h:help表示显示帮助的意思 -v:version显示版本的意思,和-h的功能一样 -u:user显示指定用户的进程,例如:top -u root -p:pid显示指定进程,例如: ...

  6. CSS 超出隐藏问题

    .dropdown-navbar>li:last-child>a { border-bottom: 0 solid #DDD; border-top: 1px dotted transpa ...

  7. 程序设计入门——C语言 第4周编程练习 1 素数和(5分)

    题目内容: 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推. 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的 ...

  8. 转:VC include 路径解析

    VC include 路径解析 要了解vc中使用#include命令包含头文件所搜寻的路径,必须先了解vc中的几种路径: 1. 系统路径 系统路径在vc中是"Tools->Option ...

  9. spring aop搭建redis缓存

    SpringAOP与Redis搭建缓存 近期项目查询数据库太慢,持久层也没有开启二级缓存,现希望采用Redis作为缓存.为了不改写原来代码,在此采用AOP+Redis实现. 目前由于项目需要,只需要做 ...

  10. 用python的BeautifulSoup分析html 【转】

    原地址:http://www.cnblogs.com/twinsclover/archive/2012/04/26/2471704.html 序言 之前用python爬取网页的时候,一直用的是rege ...