• Qt 线程池QThreadPool类、QRunnable类


    QThreadPool类

    用来管理 QThreads。此类中的所有函数都是线程安全的.

    主要属性:

    1、activeThreadCount: 此属性表示线程池中的活动线程数,通过activeThreadCount() 调用。

    2、expiryTimeout: 线程活着的时间。没有设置expiryTimeout毫秒的线程会自动退出,此类线程将根据需要重新启动。默认的expiryTimeout为30000毫秒 (30 秒)。

         如果expiryTimeout为负,则新创建的线程将不会过期, 在线程池被销毁之前, 它们将不会退出。通过expiryTimeout()调用,通setExpiryTimeout(int expiryTimeout)设置 。 

    3、maxThreadCount : int 表示线程池使用的最大线程数。
        通过maxThreadCount() 调用,通过setMaxThreadCount(int maxThreadCount) 设置
       注意:即使maxThreadCount限制为零或为负数, 线程池也至少有1个线程。

    主要成员函数

    QThreadPool *QThreadPool::globalInstance()

    返回Qt应用程序全局线程池实例。

     

    void reserveThread()

    预约一个线程,这个函数总是会增加活动线程的数量。这意味着通过使用这个函数,activeThreadCount()可以返回一个大于maxThreadCount()的值。

     

    void releaseThread()

    释放以前通过调用reserveThread()预约的线程。
    如果不先预约一个线程,调用这个函数会临时增加maxThreadCount()。当线程进入休眠等待时,能够允许其他线程继续。
    要记得在完成等待时调用reserveThread(),以便线程池可以正确控制activeThreadCount()。

     

    void QThreadPool :: start(QRunnable * runnable,int priority = 0)

    在任务数量小于maxThreadCount时,为每个runnable任务预约一个线程。超过maxThreadCount时,将任务放入运行队列中。priority 参数用来设置线程运行优先级。

     

    bool tryStart(QRunnable *runnable)

    此方法尝试预约一个线程来运行runnable。
    如果在调用的时候没有线程可用,那么这个函数什么都不做,并返回false。否则,将使用一个可用线程立即运行runnable,并返回此函数true。

     

    void clear()

    用于删除在任务队列中,还没有启动的任务。

     

    bool tryTake(QRunnable *runnable)

    如果runnable任务还没开始运行,那么从队列中删除此runable任务,此时函数返回true;如果runnable任务已经运行,返回false。
    只用来删除runnable->autoDelete() == false的runnable任务,否则可能会删错任务.

     

    bool waitForDone(int msecs = -1)

    等待msecs毫秒, 以便所有线程退出并从线程池中移除所有线程。如果删除了所有线程, 则返回true ,否则, 它将返回false。默认等待时间为-1,即等待最后一个线程退出。

    QRunnable类

    QRunnable类是所有runable对象的基类。
    QRunnable类是一个接口, 用于表示需要执行的任务或代码段, 具体任务在run() 函数内部实现。
    可以使用QThreadPool在各个独立的线程中执行代码。如果autoDelete() 返回true (默认值), QThreadPool将自动删除QRunnable 。使用setAutoDelete() 可更改是否自动删除。

     

    主要成员函数

    bool autoDelete() const

    获取自动删除是否启用,启用返回true,未启用返回false。

     

    virtual void run() = 0

    纯虚函数,在QRunnable子类中实现详细任务处理逻辑。

     

    void setAutoDelete(bool autoDelete)

    如果autoDelete为 true, 则启用自动删除。否则自动删除将被禁用。
    如果启用了自动删除, QThreadPool将在调用 run () 函数返回后自动删除此runable对象。否则, runable对象所有权不属于线程池,由开发人员管理。
    请注意, 必须先设置此标志,(默认构造函数已经将其设置为true),然后才能调用QThreadPool:: start()。在QThreadPool:: start() 之后调用此函数将导致不可预测后果。

    调用此函数将导致不可预测后果。

    程序:

    任务类(runable类)头文件

     1 #ifndef PRINTTASK_H
     2 #define PRINTTASK_H
     3 
     4 #include <QObject>
     5 #include <QRunnable>
     6 
     7 class PrintTask : public QObject, public QRunnable
     8 {
     9     Q_OBJECT
    10 
    11 public:
    12     PrintTask();
    13     ~PrintTask();
    14 protected:
    15     void run();
    16 
    17 signals:
    18     //注意!要使用信号,采用QObejct 和 QRunnable多继承,记得QObject要放在前面
    19     void mySignal();
    20 };
    21 
    22 #endif // PRINTTASK_H

    任务类(runable类)实现文件

     1 #include "printtask.h"
     2 #include <QThread>
     3 #include <iostream>
     4 using std::cout;
     5 using std::endl;
     6 
     7 PrintTask::PrintTask()
     8 {
     9 }
    10 
    11 PrintTask::~PrintTask()
    12 {
    13 
    14 }
    15 
    16 //线程真正执行的内容
    17 void PrintTask::run()
    18 {
    19     cout << "PrintTask run 被调用,调用线程ID为:" << QThread::currentThread() << endl;
    20 }

    主函数文件:

     1 #include <QCoreApplication>
     2 #include <QThreadPool>
     3 #include "printtask.h"
     4 
     5 int main(int argc, char *argv[])
     6 {
     7     QCoreApplication a(argc, argv);
     8 
     9     //设置最大线程数为3的一个线程池
    10     QThreadPool pool;
    11     pool.setMaxThreadCount(3);
    12 
    13     for(int i = 0; i < 20; i++)
    14     {
    15         pool.start(new PrintTask());
    16     }
    17 
    18     return a.exec();
    19 }

    输出:

     1 PrintTask run 被调用,调用线程ID为:00533678
     2 PrintTask run 被调用,调用线程ID为:00533678
     3 PrintTask run 被调用,调用线程ID为:004F3868
     4 PrintTask run 被调用,调用线程ID为:004F3848
     5 PrintTask run 被调用,调用线程ID为:00533678
     6 PrintTask run 被调用,调用线程ID为:00533678
     7 PrintTask run 被调用,调用线程ID为:004F3848
     8 PrintTask run 被调用,调用线程ID为:004F3868
     9 PrintTask run 被调用,调用线程ID为:00533678
    10 PrintTask run 被调用,调用线程ID为:00533678
    11 PrintTask run 被调用,调用线程ID为:004F3848
    12 PrintTask run 被调用,调用线程ID为:00533678
    13 PrintTask run 被调用,调用线程ID为:004F3868
    14 PrintTask run 被调用,调用线程ID为:004F3848
    15 PrintTask run 被调用,调用线程ID为:00533678
    16 PrintTask run 被调用,调用线程ID为:004F3868
    17 PrintTask run 被调用,调用线程ID为:004F3848
    18 PrintTask run 被调用,调用线程ID为:004F3868
    19 ...
    20 ...

    分析打印结果发现:20个任务,只有3个线程(线程ID分别为00533678、004F3848,004F3868)去执行。

  • 相关阅读:
    GCJ 2015-Qualification-A Standing Ovation 难度:0
    CF 103E Buying Sets 最大权闭合子图,匹配 难度:4
    HDU 1560 DNA sequence A* 难度:1
    蓝桥杯练习系统 矩阵翻硬币 大数,牛顿迭代法 难度:2
    Operating System Concepts with java 项目: Shell Unix 和历史特点
    HDU 2181 哈密顿绕行世界问题 dfs 难度:1
    HDU 3533 Escape bfs 难度:1
    HDU 3567 Eight II 打表,康托展开,bfs,g++提交可过c++不可过 难度:3
    POJ 1011 Sticks dfs,剪枝 难度:2
    UVALive 5905 Pool Construction 最小割,s-t割性质 难度:3
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/12205297.html
Copyright © 2020-2023  润新知