QThread 创建多线程程序
QThread 类功能简介
今天说一下 Qt 中的多线程。QThread
类不依赖平台的管理线程的方法。一个 QThread
类的对象管理一个线程,一般从 QThread
继承一个自定义类,并重新定义虚函数 run()
,在 run()
函数里实现线程需要完成的任务。
将应用程序的线程称为主线程,额外创建的线程称为工作线程。一般在主线程里创建工作线程,并调用 start()
开始执行工作线程的任务。start()
会在内部调用 run()
函数,进入工作线程的事件循环,在 run()
函数里调用 exit()
或 quit()
可以结束线程的事件循环,或在主线程调用 terminate()
强制结束线程。
QThread
类的主要接口函数、信号和槽函数如下:
类型 | 函数 | 功能 |
---|---|---|
公共函数 | bool isFinished () | 线程是否结束 |
bool isRunning () | 线程是否正在运行 | |
Priority priority () | 返回线程的优先级 | |
公共函数 | void setPriority (Priority priority) | 设置线程优先级 |
void exit (int returnCode = 0) | 退出线程的事件循环,退出代码为 returnCode 0 表示成功,否则表示有错误。 |
|
bool wait (unsigned long time) | 阻止线程执行,知道线程结束,或等待时间超过时间 | |
公共槽函数 | void quit () | 退出线程的事件循环,并返回代码 0,等效 exit (0) |
void start (priority priority) | 内部调用 run() 开始执行线程,操作系统根据优先级参数调度 |
|
void terminate () | 终止线程运行,但不立刻结束线程,二十等待操作系统结束线程。使用 terminate() 后要 wait() |
|
信号 | void finished () | 在线程就要结束的时候发射此信号 |
void started () | 在线程开始执行、run() 函数被调用之前发射此信号 |
|
静态公共成员 | int idealThreadCount () | 返回系统上能运行的线程的理想个数 |
void msleep (unsigned long msecs) | 强制当前线程休眠 msecs 毫秒 |
|
void sleep (unsigned long secs) | 强制当前线程休眠 secs 秒 |
|
void usleep (unsigned long usecs) | 强制当前线程休眠 usecs 微妙 |
|
保护函数 | virtual void run () | start() 调用 run() 函数开始线程任务的执行,所以在 run() 函数里实现线程的任务功能 |
int exec () | 由 run() 函数调用,进入线程的事件循环,等待 exit() 退出 |
QThread
时 QObject
的子类,所以可以使用信号与槽机制。QThread
自身定义了 started()
和 finished()
俩个信号,started()
信号在线程开始执行之前发射,也就是在 run()
函数被调用之前,finished()
信号在线程就要结束的时候发射。
投骰子线程 QDiceThread
作为实例,定义一个投骰子的线程类 QDiceThread
,类的声明部分如下:
class QDiceThread : public QThread
{
Q_OBJECT
private:
int m_seq=0;//掷骰子次数序号
int m_diceValue;//骰子点数
bool m_Paused=true; //掷一次骰子
bool m_stop=false; //停止线程
protected:
void run() Q_DECL_OVERRIDE; //线程任务
public:
QDiceThread();
void diceBegin();//掷一次骰子
void dicePause();//暂停
void stopThread(); //结束线程
signals:
void newValue(int seq,int diceValue); //产生新点数的信号
};
- 重载虚函数
run()
,在此函数里完成线程的主要任务。 - 自定义
diceBegin()
、dicePause()
、stopThread()
三个公共函数用于线程控制,这三个函数由主线程调用。 - 定义了要给信号
newValue(int seq, int diceValue)
用于在投一次骰子得到新的点数之后发射此信号,由主线程的槽函数相应以获取值。
QDiceThread
类的实现代码如下:
#include