一 Qt多线程(QThread)
1 创建线程方法1:QObject::moveToThread
class Myclass:public QObject{
Q_OBJECT
public slots:
void func(void){
//耗时或阻塞操作,需要放在子线程中执行
}
};
QThread thread;//子线程对象
Myclass myobject;//需要放在子线程中工作对象
myobject.moveToThread(&thread);//将myobject对象移动到子线程中
connect(xx,SIGNAL(xx),&myobject,SLOT(func()));//连接信号和槽函数
thread.start();//开启子线程
2 创建线程方法2:继承QThread,重写线程入口函数run
class MyClass:public QThread{
protected:
virtual void run(void){
//耗时或阻塞操作,需要放在子线程中执行
}
};
MyClass mythread;//创建子线程对象
mythread.start();//开启子线程,子类中重写run函数将会在子线程中执行
案例:多线程打印消息
1)方法1:工程(Thread1)
2)方法2:工程(Thread2)
3 线程同步
1)互斥锁:QMutex
eg:
QMutex mutex;
void run(void){
mutex.lock();//加锁
//访问共享资源start
if(“Error1”){
mutex.unlock();//解锁
return;
}
else if(“Error2”){
mutex.unlock();//解锁
return;
}
//访问共享资源end
mutex.unlock();//解锁
}
------------------------------------
eg:QMutexLocker简化加锁和解锁过程;
QMutex mutex;
void run(void){
QMutexLocker locker(&mutex);//加锁
//访问共享资源start
if(“Error1”){
return;
}
else if(“Error2”){
return;
}
//访问共享资源end
}//析构locker时,在析构函数中自动解锁
2)信号量:QSemaphore
//初始化信号量计数值5,表示有5个可用的共享资源
QSemaphore sem(5); // sem.available() == 5
//获取3个共享资源,剩余2个可用的共享资源
sem.acquire(3); // sem.available() == 2
//获取2个共享资源,剩余0个可用的共享资源
sem.acquire(2); // sem.availa