Qt中多线程的使用方式对比表格,赞!

用表格来给大家呈现,省的老是搞不清楚Qthread、Qthreadpool等的用法:


说明


QThread

最常用,重写run()函数即可,可以使用信号、槽。比较适合一些常驻内存的任务。


moveToThread

QThread的变种,把QObject的函数move到QThread中,也可用信号、槽。可以传递参数,后期代码维护想做成多线程但是不想大改时,move最方便,也可以常驻内存。


QThreadPool

适合那种干一次或者多次,而且自己独立相关的事情。比如排序、网络处理等。不能用信号、槽,可以多继承QObject来使用信号槽。


QtConcurrent

跟ThreadPool类似,更加方便,随用谁写,都不用继承,直接lambda就可开搞。但是它可以内部emit信号,这个比较爽。


有其他的可留言交流。

这表格居然没有颜色。。。。。


这个兄弟整理的也不错:

如何正确使用QThread


生命周期场景方案
无死循环线程运行一个方法,方法结束后即退出线程1. 定义一个函数,然后使用QtConcurrent::run()运行
2. 从QRunnable派生一个类,并利用全局线程池QThreadPoll::globalInstance()->start()运行

3. 从QTrhead派生一个类,重载QThread::run()函数,然后使用QThread::start运行


无死循环在容器中所有项执行相同的操作。执行过程中使用所有可用的CPU核

QtConcurrent提供map()函数来将这些操作应用于容器中的每个项,filter()用于选择容器元素,以及指定一个删减函数的选项来与容器中剩下的元素进行合并


无死循环一个耗时的操作必须在另一个线程中运行,在此期间,状态信息必须发到GUI线程

使用QThread,重载run()函数并根据情况发送信号。使用queued信号/槽连接GUI线程


死循环有一对象位于另一个线程中,将让其根据不同的请求执行不同的操作

QObject派生一个类并实现必要的槽和信号,将对象移到一个具有事件循环的线程中,并通过queued信号/槽连接与该对象进行通信


死循环对象位于另一个线程中,对象不断执行重复的任务(如轮询某个端口,并与GUI线程通信)

在工作者线程中使用一个计时器来实现轮询。但是最好的解决方法是完全避免轮询。使用QSocketNotifier是不错的选择



本文为3YL原创,转载无需联系,但请注明来自labisart.com。

原创文章不易,如果觉得有帮助,可打赏或点击右侧广告支持:

查看打赏记录

发表评论请遵守党国法律!后台审核后方可显示!
  • 最新评论
  • 总共0条评论
  • Blog v1.1© 2024 labisart.com 版权所有 | 联系:labartwork@163.com