QThread介绍
QThread类提供了一个与平台无关的管理线程的方法。一个QThread对象管理一个线 程。QThread的执行从run()函数的执行开始,在Qt自带的QThread类中,run()函数通 过调用exec()函数来启动事件循环机制,并且在线程内部处理Qt的事件。在Qt中建立 线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响 应用户的请求操作。QThread的使用方法有如下两种:
- QObject::moveToThread()
- 继承QThread类
Concurrent 下面通过具体的方法描述和例子来先介绍前两种方法。
演示线程
创建线程 - 继承QThread - 重写run
默认情况,新建的类(除了少部分),不支持信号与槽
在class中加一个 Q_OBJECT
- myThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QDebug>
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread();
void setThreadName(QString);
protected:
void run();
private:
QString threadName;
};
#endif // MYTHREAD_H
- myThread.cpp
#include "myThread.h"
MyThread::MyThread()
{
}
void MyThread::setThreadName(QString name)
{
threadName = name;
}
void MyThread::run()
{
while(1)
{
qDebug() << threadName << "I'am A thread";
sleep(1);
}
}
线程锁 QMutex
QMutex类提供了一种保护一个变量或者一段代码的方法,这样可以每次只让一个线程 访问它。这个类提供了一个lock()函数用于锁住互斥量,如果互斥量是解锁状态,那么 当前线程立即占用并锁定它;否则,当前线程会阻塞,直到这个互斥量的线程对它解 锁为止。QMutex类还提供了一个tryLock()函数,如果该互斥量已经锁定,它就会立即 返回。
- Qt帮助文档演示QMutex
- 对一个全局变量限制,要使用同一把锁
注意: 1、线程里面尽量少用 while(1) + sleep() 尽量用事件驱动,少用耗时扫描