**
QMutexLocker的用法
**
1、什么是QMutexLocker ?
答:QMutexLocker 是基于QMutex的便利类
2、为什么要引入QMutexLocker?
答:(1)QMutex的目的是保护一个对象、数据结构或者代码段,所以同一时间只有一个线程可以访问它。但是QMutex的操作很繁琐,并且容易出错,并且出错了调试很麻烦,因此使用QMutexLocker这个类就能很好的避免这个问题。
(2)QMutexLocker上锁,解锁的原理:在该局部变量被创建的时候上锁,当所在函数运行完毕后该QMutexLocker局部变量在栈中销毁掉,根据他自己的机制也就相对应的解锁了。
3、具体实现
//(1)定义类型
QMutexLocker(QMutex *mutex)
// 首先字头文件(.h)中做如下声明
QMutex local_mutex;
// 其次在(.cpp)文件中需要用到位置如下上锁
QMutexLocker locker(&local_mutex);
// 注:按照个人理解,根据定义,也可以在(.cpp)文件中需要用位置直接如下定义
QMutexLocker locker(QMutex *local_mutex);
在程序中的实现
Thread.h头文件
#include <QThread>
#include <QMutex>
extern int a;
// 声明 local_mutex
QMutex local_mutex;
class Thread : public QThread
{
public:
Thread();
~Thread();
private:
bool communicate_with_fpga_object_isstop_flag;
protected:
void run();
};
thread.cpp文件
#include <thread.h>
Thread::Thread(QObject* parent):QObject(parent)
{
}
Thread::~Thread()
{
QMutexLocker locker(&local_mutex);
communicate_with_fpga_object_isstop_flag = true;
quit();
wait();
}
void Thread::run()
{
{
QMutexLocker locker(&local_mutex);
communicate_with_fpga_object_isstop_flag = false;
}
while (true)
{
QMutexLocker locker(&local_mutex);
if(communicate_with_fpga_object_isstop_flag)
{
break;
}
if(local_read_fpga_packet_file_settings.isread_fpga_packet_from_file_flag)
{
if(isstart_read_fpga_packet_file_flag)
{
getNextFpgaPacketFromFile();
Sleep(5);
}
}
else
{
getNextFpgaPacketFromSerialPort();
}
}
}