Qt线程池

您所在的位置:网站首页 qt进程和线程 Qt线程池

Qt线程池

2023-03-28 07:42| 来源: 网络整理| 查看: 265

说明

Qt中可以有多种使用线程的方式:

继承 QThread,重写 run() 接口;使用 moveToThread() 方法将 QObject 子类移至线程中,内部的所有使用信号槽的槽函数均在线程中执行;使用 QThreadPool 线程池,搭配 QRunnable;使用 QtConcurrent;

本文跳过第1和第2中方式,介绍后面两种

线程池创建和销毁线程需要和OS交互,少量线程影响不大,但是线程数量太大,势必会影响性能,使用线程池可以这种开销;线程池维护一定数量的线程,使用时,将指定函数传递给线程池,线程池会在线程中执行任务;(一)QThreadPool和QRunnable

Qt中需要继承 QRunnable,重写 run() 方法,并,将其传递给线程池 QThreadPool 进行管理

QRunnable常用接口bool QRunnable::autoDelete() const; void QRunnable::setAutoDelete(bool autoDelete);QRunnable 常用函数不多,主要设置其传到底给线程池后,是否需要自动析构;若该值为false,则需要程序员手动析构,要注意内存泄漏;QThreadPool常用接口void QThreadPool::start(QRunnable * runnable, int priority = 0); bool QThreadPool::tryStart(QRunnable * runnable);start() 预定一个线程用于执行QRunnable接口,当预定的线程数量超出线程池的最大线程数后,QRunnable接口将会进入队列,等有空闲线程后,再执行;priority指定优先级tryStart() 和 start() 的不同之处在于,当没有空闲线程后,不进入队列,返回falsevoid QThreadPool::cancel(QRunnable * runnable); void QThreadPool::clear();如果,指定的QRunnable还没有执行,则从队列中移除清空队列中还没有执行的QRunnable;bool QThreadPool::waitForDone(int msecs = -1);等待所有线程结束并释放资源(如果需要自动释放的话);msecs指定超时;若所有线程都被移除,则,返回true,否则返回false;int maxThreadCount() const void setMaxThreadCount(int maxThreadCount)线程池维护的最大线程数量;设定该值,不会影响已经开始的线程;若没有设定,默认值是最大线程数,可以用:QThread::idealThreadCount(); 获取;int expiryTimeout() const void setExpiryTimeout(int expiryTimeout)线程的终结超时;没有开启,且超过终结时间的线程,会退出,这些线程会根据需要重启开始,即这些线程不会消失,线程池会重新取出这些线程,开启或者放入队列,所谓的终结超时就是重新排列等待队列;建议在创建线程池后,调用 start() 前设定终结超时;static QThreadPool * QThreadPool::globalInstance();全局内存池实例;若创建QThreadPool实例,则在实例生存周期内,内存池有效,代码示例//MyRunnable.h class MyRunnable : public QRunnable { public: MyRunnable(const QString& thread_name); void run(); private: QString threadName; };//MyRunnable.cpp #include "myrunnable.h" MyRunnable::MyRunnable(const QString &thread_name) : threadName(thread_name){} void MyRunnable::run() { qDebug()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3