用表格来给大家呈现,省的老是搞不清楚Qthread、Qthreadpool等的用法:
类 | 说明 |
QThread | 最常用,重写run()函数即可,可以使用信号、槽。比较适合一些常驻内存的任务。 |
moveToThread | QThread的变种,把QObject的函数move到QThread中,也可用信号、槽。可以传递参数,后期代码维护想做成多线程但是不想大改时,move最方便,也可以常驻内存。 |
QThreadPool | 适合那种干一次或者多次,而且自己独立相关的事情。比如排序、网络处理等。不能用信号、槽,可以多继承QObject来使用信号槽。 |
QtConcurrent | 跟ThreadPool类似,更加方便,随用谁写,都不用继承,直接lambda就可开搞。但是它可以内部emit信号,这个比较爽。 |
有其他的可留言交流。
这表格居然没有颜色。。。。。
这个兄弟整理的也不错:
生命周期 | 场景 | 方案 |
---|---|---|
无死循环 | 线程运行一个方法,方法结束后即退出线程 | 1. 定义一个函数,然后使用QtConcurrent::run() 运行2. 从 QRunnable 派生一个类,并利用全局线程池QThreadPoll::globalInstance()->start() 运行3. 从 |
无死循环 | 在容器中所有项执行相同的操作。执行过程中使用所有可用的CPU核 |
|
无死循环 | 一个耗时的操作必须在另一个线程中运行,在此期间,状态信息必须发到GUI线程 | 使用 |
死循环 | 有一对象位于另一个线程中,将让其根据不同的请求执行不同的操作 | 从 |
死循环 | 对象位于另一个线程中,对象不断执行重复的任务(如轮询某个端口,并与GUI线程通信) | 在工作者线程中使用一个计时器来实现轮询。但是最好的解决方法是完全避免轮询。使用 |