在Qt中, QThread类以系统无关的方式,封装了有关线程管理的底层细节,在逻辑层面将线程对象化。一个QThread类及其子类的对象就是一个线程。定义自己的线程,只需继承QThread类,并覆盖其中名为run的虚函数。启动线程,只需通过该子类的实例化对象,调用其继承自基类的start方法。这时run函数在子类中的覆盖版本将被子线程执行。
Qt所做的工作:
xxxxxxxxxx
341class QThread
2{
3 ...
4public:
5 ...
6 void start(void) // 启动线程
7 {
8 ...
9 pthread_create(&thread, &attr, start_routine, this); // 创建子线程
10 ...
11 }
12 ...
13protected:
14 ...
15 virtual void run(void) // 被线程过程函数调用的虚函数
16 {
17 ...
18 exec(); // 陷入事件循环
19 ...
20 }
21 ...
22private:
23 ...
24 static void* start_routine(void* arg) // 线程过程函数
25 {
26 ...
27 ((QThread*)arg)->run(); // 调用虚函数
28 ...
29 }
30 ...
31 pthread_t thread; // 线程标识
32 pthread_attr_t attr; // 线程属性
33 ...
34};
子线程开发者所做的工作:
xxxxxxxxxx
111class WorkThread: public QThread
2{
3 ...
4protected:
5 ...
6 void run(void) // 覆盖基类中的虚函数
7 {
8 ... // 在子线程中完成的任务
9 }
10 ...
11};
子线程使用者所做的工作:
xxxxxxxxxx
21WorkThread work(...);
2work.start();
xxxxxxxxxx
61bool QThread::isRunning(); // 线程是否正在运行
2bool QThread::isFinished(); // 线程是否已经终止
3Priority QThread::priority(); // 获取线程的优先级
4void QThread::setPrioriy(QThread::Priority priority); // 设置线程的优先级
5void QThread::exit(int returnCode = 0); // 以returnCode为退出码退出事件循环,退出码为0表示成功,非0表示失败
6bool QThread::wait(unsigned long time); // 等待线程终止,超过time毫秒提前返回
xxxxxxxxxx
31void QThread::start(QThread::Priority priority = InheritPriority); // 以priority优先级启动线程
2void QThread::quit(); // 以0为退出码退出事件循环,等价于exit(0)
3void QThread::terminate(); // 终止线程,但线程不一定立即终止,应使用wait等待其终止
xxxxxxxxxx
21void QThread::started(); // 线程刚刚启动,执行run函数之前,发射此信号
2void QThread::finished(); // 线程即将终止,发射此信号
xxxxxxxxxx
41void QThread::sleep(unsigned long secs); // 当前线程睡眠secs秒
2void QThread::msleep(unsigned long msecs); // 当前线程睡眠msecs毫秒
3void QThread::usleep(unsigned long usecs); // 当前线程睡眠usecs微秒
4int QThread::idealThreadCount(); // 获取系统可运行线程数的理想值
xxxxxxxxxx
21virtual void QThread::run(); // 在所创建的线程中被执行
2 int QThread::exec(); // 陷入事件循环,直到exit或quit被调用