网站首页 > 文章精选 正文
多线程程序
一个应用程序一般只有一个线程,一个线程内的操作是顺序执行的,如果有某个比较消耗时 间的计算或操作,比如网络通信中的文件传输,在一个线程内操作时,用户界面就可能会冻结而不能及时响应。这种情况下,可以创建一个单独的线程来执行比较消耗时间的操作,并与主线程之间处理好同步与数据交互,这就是多线程应用程序。
Qt多线程支持
Qt为多线程操作提供了完整的支持。QThread是线程类,是实现多线程操作的核心类,一般从QThread继承定义自己的线程类。
线程之间的同步是其交互的主要问题,Qt提供了 QMutex、 QMutexLocker、QReadWriteLock、QWaitCondition、QSemaphore 等多种类用于实现线程之间的同步。
Qt还有Qt Concurrent模块,提供一些高级的API实现多线程编程而无需使用QMutex、 QWaitCondition和QSemaphore等基础操作。使用Qt Concurrent实现的多线程程序可以自动根据处理器内核个数调整线程个数。
QThread类功能简介
QThread类提供不依赖于平台的管理线程的方法。一个QThread类的对象管理一个线程,一般从QThread继承一个自定义类,并重定义虚函数run(),在run()函数里实现线程需要完成的任务。
将应用程序的线程称为主线程,额外创建的线程称为工作线程。一般在主线程里创建工作线 程,并调用start()开始执行工作线程的任务。start()会在内部调用run()函数,进入工作线程的事件循环,在run()函数里调用exit()或quit()可以结束线程的事件循环,或在主线程里调用terminate()强制结束线程。
QThread类的主要接口函数、信号和槽函数如下。
(1)公共函数
- bool isFinished() 线程是否结束
- bool isRunning() 线程是否正在运行
- Priority priority() 返回线程的优先级
- void setPriority (Priority priority) 设置线程的优先级
- void exit(int retumCode = 0) 退出线程的事件循环,退出码为retumCode,0表示成功退出;否则表示有错误
- bool wait(unsigned long time ) 阻止线程执行,直到线程结束(从run()函数返回),或等待时间超过 time毫秒
(2)公共槽函数
- void quit() 退出线程的事件循环,并返回代码0, 等效于exit(0)
- void start(Priority priority) 内部调用run()开始执行线程,操作系统根据priority参数进行调度
- void terminate() 终止线程的运行,但不是立即结束线程,而是等待操作系统结束线程。使用terminate()之后应使用wait()
(3)信号
- void finished() 在线程就要结束时发射此信号
- void started() 在线程开始执行、run()函数被调用之前发射此信号
(4)静态公共成员
- int idealThreadCount() 返回系统上能运行的线程的理想个数
- void msleep(unsigned long msecs) 强制当前线程休眠msecs毫秒
- void sleep(unsigned long secs) 强制当前线程休眠secs秒
- void usleep(unsigned long usees) 强制当前线程休眠usees微秒
(5)保护函数
- virtual void run() start()调用run()函数开始线程任务的执行,所以在run()函数里实现线程的任务功能
- int exec() 由run()函数调用,进入线程的事件循环,等待exit()退出
QThread是QObject的子类,所以可以使用信号与槽机制。QThread自身定义了started()和 fmished()两个信号,started()信号在线程开始执行之前发射,也就是在run()函数被调用之前, finished()信号在线程就要结束时发射。
猜你喜欢
- 2025-06-08 Qt MQTT之服务器介绍(mqtt服务器功能)
- 2025-06-08 在 STM32 开发里,RTOS 真比裸机编程更有优势?别盲目迷信!
- 2025-06-08 C++大型流媒体项目-从底层到应用层千万级直播系统实战
- 2025-06-08 万能药:胺碘酮使用注意事项(胺碘酮用法及用量)
- 2025-06-08 同一个类,不同代码,Qt 串口类QSerialPort 与各种外设通讯处理
- 2025-06-08 室性心律失常首选药物大汇总(室性心律失常首选下列哪种药物)
- 2025-06-08 QT桌面客户端在Linux下的开发流程
- 2025-06-08 座舱SOC的Linux内核性能调优(座舱soc起不来)
- 2025-06-08 为什么要有协程?(为什么要有协议)
- 2025-06-08 干货收藏!10分钟帮你搞定3种心电图!
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)