Qt 多线程(QThreadPool)

原创 2016年06月02日 00:21:51

开发环境 Qt5.5.1、Qt Creator 3.5.1 

#include <QCoreApplication>
#include <QObject>
#include <QDebug>
#include <QThread>
#include <QThreadPool>
#include <QPointer>

class MyRunnable;
//事件类
class MyEvent: public QEvent {
public:
    MyRunnable *m_runnable;
    QString m_message;
    MyEvent(MyRunnable *r, QString message): QEvent(eventType()), m_runnable(r), m_message(message) { }
    static QEvent::Type eventType(){
        if(s_eventType == QEvent::None) {
            //注册一个自定义类型1000-65535
            s_eventType = (QEvent::Type)registerEventType();
            //qDebug()<<"registerEventType "<<(int)s_eventType;
        }
        return s_eventType;
    }
private:
    static QEvent::Type s_eventType;
};
QEvent::Type MyEvent::s_eventType = QEvent::None;

//线程的耗时操作
class MyRunnable :public QRunnable{
public:
    MyRunnable(QObject* observer): m_observer(observer){
    }
    //Override
    void run();
private:
    //QPointer是为QObject对象提供保护指针的模板类
    //一个保护指针 QPointer,行为类似正常的C++指针,只不过其在引用对象删除之后会自动设置为0. T必须是QObject的子类
    //保护指针在你要保存别人创建的QObject对象,且有可能其已经被删除而你仍然持有其引用的时候非常有用。
    //Qt也提供QSharedPointer,一个基于引用计数的共享指针对象实现,其能使用单个指针用于维护一个引用集合
    //就是说,如果指代的对象被删除,则后面对该对象的所有操作不会执行,因此也不会抛异常
    QPointer<QObject> m_observer;
};
//Override
void MyRunnable::run() {
    QString message;
    message.append(QString::number((int)QThread::currentThreadId())+" start\r\n");
    message.append(QThread::currentThread()->objectName()+"\r\n");
    QThread::sleep(1);
    message.append(QString::number((int)QThread::currentThreadId())+" end\r\n");
    QCoreApplication::postEvent(m_observer, new MyEvent(this, message));
}

//主程序中的消息处理程序
class MyProcesser: public QObject {
public:
    MyProcesser() {
    }
    //Override
    bool event(QEvent *);
    void process();
    void abort();
private:
    QList<MyRunnable*> m_runnableList;

};
bool MyProcesser::event(QEvent *e) {
    if(e->type() == MyEvent::eventType()) {
        qDebug()<<"processer get event, type is "<<(int)e->type();
        qDebug()<<((MyEvent*)e)->m_message;
        m_runnableList.removeOne(((MyEvent*)e)->m_runnable);
    }
}
void MyProcesser::process() {
    MyRunnable* runnable = new MyRunnable(this);
    m_runnableList.append(runnable);
    //是否线程池替你删除
    //If auto-deletion is enabled, QThreadPool will automatically delete this runnable after calling run();
    //otherwise, ownership remains with the application programmer.
    runnable->setAutoDelete(false);
    QThreadPool::globalInstance()->start(runnable);
}
void MyProcesser::abort() {
    int size = m_runnableList.size();
    MyRunnable* r;
    for(int i=0;i<size;i++) {
        r = m_runnableList.at(i);
        m_runnableList.removeAt(i);
    }
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug()<<"main thread "<<QThread::currentThreadId()<<" start";
    qDebug()<<"main thread "<<QThread::currentThread()->objectName();
    MyProcesser processer;
    processer.process();
    processer.process();
    return a.exec();
}


                    
版权声明:转载请注明出处——http://blog.csdn.net/chy555chy/article

QT线程池实验研究与分析(QThread与和QThreadPool + QRunnable使用上的区别)

第一部分:QT线程池的构建与使用     网上关于QT线程池QThreadPool的文章很多,而且大都千篇一律,基本上都是参考QT的帮助文档介绍QT全局线程池的用法。这样就往往会使人产生误解,QT是不...
  • qinpanke
  • qinpanke
  • 2016年06月18日 11:57
  • 5235

Qt之QThreadPool和QRunnable

简述 QRunnable 是所有 runnable 对象的基类,而 QThreadPool 类用于管理 QThreads 集合。 QRunnable 类是一个接口,用于表示一个任务或要执行的代码,需要...
  • swartz_lubel
  • swartz_lubel
  • 2017年02月09日 11:28
  • 1541

QT 多线程(QThread)里调用线程池(QThreadPool )与主界面进行通讯

QT 多线程(QThread)里调用线程池(QThreadPool )与主界面进行通讯在最近的一个项目中,遇到了一个问题,就是主界面调用一个线程,然后再线程中开启一个线程池进行数据生成,线程池调用的线...
  • octdream
  • octdream
  • 2017年08月25日 22:33
  • 709

QThreadPool的简单使用

实际上Qt的ThreadPool和java的线程池使用起来比较像,简单的例子如下: class HelloWorldTask : public QRunnable { void run() ...
  • eversliver
  • eversliver
  • 2016年08月19日 10:18
  • 835

QThreadPool 使用记录

QThreadPool 自己开发中遇到的问题,记录下来
  • zhango5
  • zhango5
  • 2016年09月26日 12:08
  • 1108

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

Qt 线程基础(QThread、QtConcurrent、QThreadPool等)   2012-06-25 11:42:56|  分类: Qt|字号 订阅 使用...
  • myths_0
  • myths_0
  • 2013年09月06日 19:08
  • 7246

QT线程池的使用:QThreadPool类和QRunnable类

目录QThreadPool类 主要属性 主要成员函数 QRunnable类 主要成员函数 程序实例 QThreadPool类用来管理 QThreads。此类中的所有函数都是线程安全的.主要属性:1、a...
  • y396397735
  • y396397735
  • 2017年11月26日 16:08
  • 113

QThreadPool类和QtConcurrent命名空间

一、QThreadPool类   QThreadPool管理一组线程。它负责管理和回收单个QThread对象以减少程序中线程创建的开销。每个Qt应用程序都有一个全局的QThrea...
  • fuyajun01
  • fuyajun01
  • 2011年12月16日 00:38
  • 7708

Qt 线程池(QThreadPool )的使用

  • 2017年12月14日 15:50
  • 4KB
  • 下载

Qt之保持GUI响应

简述Qter们经常遇到由于耗时操作造成GUI阻塞的问题。其实,这个问题并不难克服,可以采用许多不同的方式,下面我会列举一些提可选范围,可以根据使用情况进行处理。简述 执行长时间操作 手动事件处理 使用...
  • u011012932
  • u011012932
  • 2016年07月13日 21:13
  • 8261
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt 多线程(QThreadPool)
举报原因:
原因补充:

(最多只允许输入30个字)