QT(12)-QThreadPool

1 简介

QThreadPool是Qt框架中的一个类,提供了一组工作线程池。该线程池自动管理一组工作线程,在线程可用时分配任务。使用线程池的主要优点是,它可以减少创建和销毁线程的开销,因为可以重复使用线程。

线程池设计用于场景中,你有大量短暂任务需要并发运行。例如,如果您有一个需要执行大量I/O绑定或CPU绑定任务的GUI应用程序,可以使用线程池在后台运行这些任务,而不会阻塞GUI线程。

要使用QThreadPool,您需要创建一个从QRunnable派生的任务类,并实现run()方法。然后,您创建任务类的实例,并使用start()方法将其添加到线程池中。线程池将自动将任务分配给其中一个工作线程,并在后台运行任务。

除了基本的线程池功能外,QThreadPool还提供了优先级任务和设置最大并发线程数的支持。这在您需要确保在其他任务之前执行某些任务或限制并发线程数以避免超载系统

2 函数

静态公有函数
QThreadPool * globalInstance()

globalInstance() 是 QThreadPool 的静态函数,它返回一个指向全局 QThreadPool 单例对象的指针。全局 QThreadPool 对象是整个程序共享的,不需要手动创建。通过调用 globalInstance() 函数,可以在程序中访问到这个全局的 QThreadPool 对象,并通过它管理线程。

int activeThreadCount() const
获取线程池中当前活动的线程数。

void clear()
移除线程池中的所有任务,并删除已经设置了 runnable->autoDelete() 属性为 true 的任务,并销毁已经启动但尚未完成的线程。

bool contains(const QThread *thread) const
它用于检查线程池是否包含给定的线程。如果包含,则返回 true,否则返回 false。这个函数可以用于动态管理线程池中的线程,以确保线程池的效率和效果。

int expiryTimeout() const
void setExpiryTimeout(int expiryTimeout)
用于设置线程池中线程的超时时间。线程池会检查未使用的线程,并在它们在指定时间内未使用的情况下将它们视为已过期,并将其终止。这可以防止线程长时间占用线程池中的资源,并可以提高线程池的效率。

默认情况下,新创建的线程的超时时间为30000毫秒(30秒)。如果超时时间为负数,则新创建的线程不会过期,也就是说,它们不会在线程池被销毁之前退出。

请注意,在已经运行的线程上设置超时时间不会产生任何影响。仅新创建的线程会使用新的超时时间。因此,建议在创建线程池后立即设置超时时间,但在调用 start 函数之前。

int maxThreadCount() const
void setMaxThreadCount(int maxThreadCount)
此属性表示线程池使用的最大线程数。为设置时是理想线程数
注意:线程池将始终使用至少 1 个线程,即使maxThreadCount限制为零或负数。

void releaseThread()
它释放由之前调用 reserveThread 函数预留的线程。
在某些情况下,线程可能需要等待更多工作,此时调用 releaseThread 函数可以让该线程临时释放,从而允许其他线程继续执行。但是,当线程再次获得任务并继续处理时,应该再次调用 reserveThread 函数,以确保线程池能够正确维护 activeThreadCount。

void reserveThread()
reserveThread 函数是 QThreadPool 类中的一个函数,它用于预留一个线程。这个函数不会考虑当前的活动线程数量和最大线程数量,因此可以保证您可以预留一个线程。

在完成使用线程后,请调用 releaseThread 函数,以便将其重新用于其他任务。

请注意,使用此函数将永远增加活动线程的数量。这意味着通过使用此函数,activeThreadCount 函数可能返回一个大于 maxThreadCount 的值。

void setStackSize(uint stackSize)
uint stackSize() const
线程栈大小是指线程在执行任务时使用的内存空间的大小。

该函数的参数是栈的大小,以字节为单位。如果未指定栈的大小,则使用默认值。默认栈大小对于大多数程序应该足够,但是,如果您的程序需要更大的栈,则可以使用此函数调整栈大小。

void start(QRunnable *runnable, int priority = 0)
void start(std::function<void ()> functionToRun, int priority = 0)
void start(QRunnable *runnable, int priority = 0):该版本接收一个 QRunnable 对象作为参数。您可以将任务封装在 QRunnable 对象中,然后将该对象传递给 start 函数,以在线程池中运行该任务。参数 priority 表示任务的优先级,默认值为0,表示普通优先级。

void start(std::function<void ()> functionToRun, int priority = 0):该版本接收一个 std::function 对象作为参数。您可以将任务封装在该对象中,然后将该对象传递给 start 函数,以在线程池中运行该任务。参数 priority 表示任务的优先级,默认值为0,表示普通优先级。

// Using QRunnable
class MyTask : public QRunnable
{
    void run()
    {
        // Code to run in a thread
    }
};

QThreadPool::globalInstance()->start(new MyTask());

// Using std::function
QThreadPool::globalInstance()->start([]()
{
    // Code to run in a thread
});

bool tryStart(QRunnable *runnable)
如果在调用时没有可用的线程,那么这个函数不做任何操作并返回 false。否则,runnable 将立即使用一个可用的线程运行,此函数将返回 true。

请注意,如果 runnable->autoDelete() 返回 true,则线程池将拥有 runnable 的所有权,并且线程池在 runnable->run() 返回后将自动删除 runnable。如果 runnable->autoDelete() 返回 false,则 runnable 的所有权仍然归调用者所有。请注意,在调用此函数后更改 runnable 的自动删除将导致未定义的行为。
bool tryStart(std::function<void ()> functionToRun)
尝试保留一个线程来运行 functionToRun。

如果在调用时没有可用的线程,那么这个函数不做任何操作并返回 false。否则,functionToRun 将立即使用一个可用的线程运行,此函数将返回 true。

bool tryTake(QRunnable *runnable)
函数尝试从队列中删除指定的未启动的 Runnable。如果 Runnable 尚未启动,则返回 true,并且 Runnable 的所有权转移到调用者(即使 runnable->autoDelete() 返回 true)。否则返回 false。

注意:如果 runnable->autoDelete() 返回 true,则可能删除错误的 Runnable。这是 ABA 问题:原始的 Runnable 可能已经执行过并且已经被删除。内存被另一个 Runnable 重用,然后被删除。因此,我们建议仅在 Runnable 没有自动删除时调用此函数。

bool waitForDone(int msecs = -1)
函数等待所有线程退出,并删除线程池中的所有线程,最多等待 msecs 毫秒。如果所有线程都已删除,则返回 true;否则返回 false。如果 msecs 为 -1(默认值),则忽略超时(等待最后一个线程退出)。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m晴朗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值