Qt—使用Qt实现多线程设计的四种方法
文章目录
一、写在前面
这篇文章内容是:关于Qt多线程应用设计的。
在Qt中提供了四种方法来进行多线程编程和设计。合理的选择对应的方法来满足实际开发中的应用场景。
二、【方法一】 QThread:带有可选事件循环的底层API
QThread是Qt中所有线程控件的基础,每个QThread实例代表和控制着一个线程。使用QThread创建线程有两种方法:1)、可以直接实例化创建,2)也可以子类化它进行线程创建。
1、实例化QThread:提供了一个并行事件循环,允许在辅助线程中调用QObject槽函数。
2、继承QThread:允许应用程序在启动事件循环之前初始化新线程,或者在没有事件循环的情况下运行并行代码。
三、【方法二】 QThreadPool和QRunnable:重用线程
频繁的创建和销毁线程的代价可能会很高。为了减少这种开销,可以对新任务重用现有的线程。QThreadPool是可重用QThreads的集合。
要在QThreadPool的一个线程中运行代码,需要重新实现QRunnable::run()并实例化子类化的QRunnable。
使用````QThreadPool::start()```将QRunnable放到QThreadPool的运行队列中。当线程可用时,QRunnable::run()中的代码将在该线程中执行。
【备注】:每个Qt应用程序都有一个全局线程池,可以通过QThreadPool::globalInstance()访问它。这个全局线程池根据CPU中的核心数量将自动维护最佳的线程数量。但是,在实际开发中,也可以显式地创建和管理一个单独的QThreadPool。
四、【方法三 】Qt并发:使用高级API
Qt并发模块提供了许多高级功能,用来处理一些常见的并行计算模式。例如:map、filter和reduce。Qt并发与使用QThread和QRunnable不同,这些函数不需要使用底层的线程原语,如互斥或信号量等。相反,它们返回的是一个QFuture对象,该对象可用于在线程准备或者完成时自动检索函数的结果;QFuture还可以用来查询、计算进度和暂停/恢复/取消计算。为了方便起见,QFutureWatcher允许通过信号和槽与QFutures进行交互。
Qt Concurrent的并行计算模型:map、filter和reduce等算法自动将计算分配到所有可用的处理器核心上,因此,我们今天编写的应用程序在以后部署到拥有更多内核的系统时将继续得以扩展和使用,这非常方便。
这个模块还提供了QtConcurrent::

本文详细介绍了Qt中实现多线程的四种方法:QThread、QThreadPool与QRunnable、Qt并发高级API以及QML中的WorkerScript。QThread允许创建带有事件循环的线程,而QThreadPool则用于重用线程,减少资源开销。Qt并发提供高级功能,如map、filter和reduce,便于并行计算。WorkerScript则在QML中实现线程化,便于JavaScript代码与GUI线程并行运行。选择合适的多线程方案取决于线程的用途和生命周期。

4万+

被折叠的 条评论
为什么被折叠?



