Qt多线程编程之QThreadPool 和 QRunnable使用

本文介绍了Qt中的QThreadPool线程池和QRunnable类的使用,包括线程池的概念、优点、成员函数,以及QRunnable的定义、与QThread的区别、启动线程的两种方式,并详细讨论了QRunnable如何与外界通信,尤其是利用QMetaObject::invokeMethod实现线程间通信。
摘要由CSDN通过智能技术生成

说到线程通常会想到QThread,但其实Qt中创建线程的方式有多种,这里主要介绍其中一种QRunnable,QRunnable和QThread用法有些不同,并且使用场景也有区别。要介绍QRunnable的用法、使用场景以及注意事项,首先还要先来看看QThreadPool,因为QRunnable任务需要使用QThreadPool启动线程。

一、QThreadPool 线程池

1.1 线程池介绍

在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在日常开发中,内存资源是及其宝贵的,所以线程池QThreadPool就建议用来管理多个线程的并发执行。在程序逻辑中经常会碰到需要处理大批量任务的情况,比如密集的网络请求,日志分析、加载工程中多个子工程、保存工程等等。一般会创建一个队列,用一个或者多个线程去消费这个队列,一般也要处理队列的加锁和解锁的问题。

 

1.2 线程池的优点

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

1.3 QThreadPool类成员函数

主要属性:
 
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()
预约一个线程,这个函数总是会增加活动线程的数量。这意味着通过使用这
Qt提供了一些类来支持多线程编程,其中最常用的是QThreadQThreadPoolQThread类是Qt中最基本的多线程实现类,它提供了一个线程对象,可以通过继承QThread类并实现run()方法来创建自己的线程。 下面是一个简单的例子: ```cpp class MyThread : public QThread { public: void run() override { // 在这里编写线程运行的代码 } }; // 创建线程对象并启动 MyThread thread; thread.start(); ``` 在这个例子中,我们继承了QThread类,并重写了它的run()方法,run()方法中编写的代码将在新线程中运行。然后,我们创建了一个MyThread对象,并通过调用start()方法来启动线程。 除了QThread外,Qt还提供了QThreadPool类来管理多个线程。QThreadPool类可以创建多个线程,并将任务分配给这些线程来执行。QThreadPool使用线程池技术来提高多线程应用程序的性能。 下面是一个简单的例子: ```cpp QThreadPool *pool = QThreadPool::globalInstance(); // 获取全局线程池对象 // 创建任务 QRunnable *myTask = new MyTask(); // 将任务添加到线程池中 pool->start(myTask); ``` 在这个例子中,我们获取了全局线程池对象,并创建了一个MyTask对象作为任务。然后,我们将任务添加到线程池中,并由线程池来决定将任务分配给哪个线程来执行。 需要注意的是,多线程编程涉及到许多复杂的问题,如线程安全、锁、信号与槽等,需要仔细设计和考虑。在使用多线程时,应该遵循一些基本的原则,如避免共享资源、避免阻塞操作等,以确保程序的正确性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值