概述
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
1. 使用多线程有什么好处?
1.1
提高应用界面的响应速度。这对于开发图形界面程序尤其重要,当一个操作耗时很长时(比如大批量I/O或大量矩阵变换等CPU密集操作),整个系统都会等待这个操作,程序就不能响应键盘、鼠标、菜单等操作,而使用多线程技术可将耗时长的操作置于一个新的线程,从而不会影响到主GUI线程,从而避免上述问题。
1.2
使多核心CPU系统更加有效:当线程数不大于CPU核数时,操作系统可以调度不同的线程运行于不同的CPU核上。
1.3
改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为独立或半独立的运行部分,这样有利于程序的理解和维护。
2. 线程编程流程
a. 子类化QThread:重写一个类,继承自QThread。
b. 重写 run 函数,run函数内有一个 while 或 for 的循环:执行耗时操作。
c. 子线程类实现公共方法,供主线程传参。主线程调用start方法开始子线程。
d. 设置一个标记为来控制循环的退出,或者父线程调用terminate停止子线程。
e. 设置必要的信号和槽做连接--子线程给主线程传参。
注意:所有的界面操作都必须在GUI主线程来进行,子线程是不允许操作界面上的任何部件!
3. 编程实例
QThread 类
Public Functions
QThread(QObject *parent = 0) //构造函数 //pthread_create
bool isFinished() const //判断线程是否退出
bool wait(unsigned long time = ULONG_MAX) //pthread_join(&id)
//等待某个线程结束,最多等待time ms,如果时间没有设置,那么永远等待。
Public Slots
void start(Priority priority = InheritPriority) //启动线程必须使用start
void terminate()-->杀死线程 //pthread_cancel
Static Public Members
Qt::HANDLE currentThreadId() [static] //得到当前执行者线程ID,可以直接qDebug
void sleep(unsigned long secs) [static]
void msleep(unsigned long msecs) [static]
void usleep(unsigned long usecs) [static]
睡眠函数不能在主线程调用,会造成界面卡死。
Protected Functions
virtual void run(); //启动新线程不能直接调用run,需要调用start接口,
//start会启动新线程,然后执行run里的代码块。
这里在线程中延时了五秒
因为是视频,就不好放了,感兴趣的可以去试一试,结果的话就是LcdNumber一直在增加。
关于线程还有很多使用的方法,这里也只是写了一个线程,实际运用中我们应该会使用多线程进行操作,大家可以自行发挥。