Qt多线程-总结QThread-QThreadPool-QtConcurrent
本文标题:Qt多线程-总结QThread-QThreadPool-QtConcurrent 本文地址:http://techieliang.com/2017/12/616/
1. 总结
QThread:Qt提供的最基础的线程类,一个对象管理一个线程,自己维护线程启动停止,创建销毁,当然也能基于此类自己建立一个线程池
QThreadPool:Qt提供的基于QThread实现的线程池,只需要提供给线程池“任务”即可,每一个“任务”需要继承QRunnable,pool还贴心的帮忙在运行完成后释放内存。只不过runnable不支持信号槽,可以做多重继承QObject即可。
QtConcurrent:并行计算的高级API,用起来很方便,完全不需要想线程的问题,全都是静态函数,可以运行自定义函数也提供了对容器的操作函数。
相关博客:
Qt多线程-QThread
QThread安全的结束线程
Qt多线程-QThreadPool线程池与QRunnable
Qt多线程-QtConcurrent并行运算高级API
2. 详细对比
2.1. Qt事件处理
只有QThread支持。但是其他两个可以用QApplication::postEvent发出事件
2.2. Qt信号槽
QThread完全支持,QThreadPool的QRunnable可以通过多重继承支持
Concurrent提供的map/filter函数可以利用QFutureWatcher,使用此方式可用信号控制线程,但仍然无发通过信号槽对线程的数据做修改
run就完全与信号槽无缘了,毕竟调用的只是一个函数
2.3. 线程优先级
这个优先级设置以后不一定有效,要看系统
QThread完全支持,可以用setPriority函数
2.4. 其他
Concurrent所有函数都支持QFuture,同时Concurrent支持指定QThreadPool
3. 使用
- 只进行一次运行,或者调用不频繁不需要长时间开着线程,也不需要数据交互,直接Concurrent省事,毕竟只需要一行,也不需要定义什么类。但如果不希望包含QT += Concurrent,那就用线程池吧。
- 单次不频繁,需要数据交互,三个都能用,对于Concurrent虽然没有信号槽但是可以自定义函数参数,注意线程安全即可。
- 频繁调用,一定不要重复的创建销毁线程,可以用线程池
- 长时间在幕后运行,一般这样的线程总要有数据交互的,建议直接QThread,主要是QThread还支持事件处理,能做的事情会很多。
Qt多线程-总结QThread-QThreadPool-QtConcurrent的更多相关文章
- Qt 线程基础(QThread、QtConcurrent、QThreadPool等)
使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使 ...
- Qt 线程基础(QThread、QtConcurrent等)
[-] 使用线程 何时使用其他技术替代线程 应该使用 Qt 线程的哪种技术 Qt线程基础 QObject与线程 使用互斥量保护数据的完整 使用事件循环防止数据破坏 处理异步执行 昨晚看Qt的Manua ...
- Qt 线程基础(QThread、QtConcurrent等) 2
使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线 ...
- Qt多线程-QtConcurrent并行运算高级API
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QtConcurrent并行运算高级API 本文地址:http://tec ...
- Qt多线程-QThreadPool线程池与QRunnable
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThreadPool线程池与QRunnable 本文地址:https:/ ...
- Qt多线程-QThread
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread 本文地址:http://techieliang.com/2 ...
- 【QT】 Qt多线程的“那些事”
目录 一.前言 二.QThread源码浅析 2.1 QThread类的定义源码 2.2 QThread::start()源码 2.3 QThreadPrivate::start()源码 2.4 QTh ...
- 1.QT多线程使用小结
开头 一个进程可以有一个或更多线程同时运行.线程可以看做是"轻量级进程",进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理. Qt 使用QThread来管理线 ...
- Qt 多线程和网络编程学习
一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...
随机推荐
- Python面向对象总结及类与正则表达式
Python3 面向对象 一丶面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 方法:类中定义的函数. 类变 ...
- Python学习 :常用模块(四)----- 配置文档
常用模块(四) 八.configparser 模块 官方介绍:A configuration file consists of sections, lead by a "[section]& ...
- 【笔记学习】Linux系统与虚拟机学习
Part 1 : 基于VirtualBox虚拟机安装Ubuntu 问题剪辑 --给一开始未知的我的科普指南 1. VirtualBox不能创建64位虚拟机 解决办法: 开启虚拟化技术 详细:重启电脑, ...
- 虚拟机与Linux的初体验
很早的时候就知道虚拟机这个神奇东西的存在,但也仅仅是只闻其名,未见其身.后来在信息安全素质教育的这门课程上,为了做木马实验.暴力破解实验以及邮件窃取实验,这才比较直接的接触到了虚拟机.当我看着在另一个 ...
- vector的二维用法+前缀和
题目链接:https://codeforces.com/contest/1082/problem/C(C. Multi-Subject Competition) A multi-subject com ...
- 【转载】从零实现3D图像引擎:(2)画2D直线不简单
原文:从零实现3D图像引擎:(2)画2D直线不简单 1. 数学分析 1) 画直线的问题 本来我以为画直线会很容易,随便拿个直线公式,遍历X求Y画出来不就完了么,但事实并非如此.以2D直线为例,因为3D ...
- 人脸识别引擎SeetaFaceEngine简介及在windows7 vs2013下的编译
SeetaFaceEngine是开源的C++人脸识别引擎,无需第三方库,它是由中科院计算所山世光老师团队研发.它的License是BSD-2. SeetaFaceEngine库包括三个模块:人脸检测( ...
- Jumpserver跳板机入门
1.jumpserver安装 1.1.环境介绍 系统: CentOS 7.4.1708IP: 192.168.56.110 [root@linux-node1 ~]# uname -r -.el7.x ...
- cogs87 乘积最大
cogs87 乘积最大 原题链接 题解 竟然不用高精... f[i][j]表示前i位数j个乘号的最大数f[i][j]=max{f[i-l][j-1]*num[i-l+1][i]} num[a][b]表 ...
- linux部署MantisBT(一)部署apache
一.部署apache 1.下载apache安装包及依赖包 http://httpd.apache.org/download.cgi#apache24(apache2)http://apr.apache ...