自定义类似QMutexLocker的CMutexLocker
来源:互联网 发布:java培训费一般多少 编辑:程序博客网 时间:2024/05/29 07:46
最近做项目遇到一个需求,有一个buttonSlot()执行要耗点时间,为了防止用户无限制的乱点出现问题,考虑加一个互斥锁,使得每次执行完后才允许执行下一次。大概意思是:
//QMutex m_mutex;是window类的成员变量
void window::buttonSlot()
{
if(m_mutex.islock())
{
return ;
}
m_mutex.lock();
..
...
...
m_mutex.unlock();
}
Qt提供的QMutex和QMutexLocker都没有islock()方法,用bool QMutex::tryLock ()可以实现类似的功能。但是我的
buttonSlot()里有好几个return 语句,要是直接用QMutex,就必须在每个return 之前一一调用unlock(),好麻烦。
所以只好借鉴 QMutexLocker ,但是QMutexLocker 在构造的时候调用的是QMutex::lock ()会卡住,而我不需要卡住
{
public:
explicit CMutexLocker (QMutex *m)
{
m_isLocked = false;
if (m)
{
m_pLocker = m;
}
}
bool tryLock()
{
if (m_pLocker)
{
m_isLocked = m_pLocker->tryLock();
}
return m_isLocked;
}
bool tryLock( int timeout)
{
if (m_pLocker)
{
m_isLocked = m_pLocker->tryLock(timeout));
}
return m_isLocked;
}
~CMutexLocker ()
{
if (m_pLocker && m_isLocked)
{
m_pLocker->unlock();
}
}
protected:
private:
bool m_isLocked;
QMutex *m_pLocker;
};
只有用起来就简单了:不会卡住等待,也无需在每个return 之前调用unlock()那么麻烦了
void window::buttonSlot()
{
CMutexLocker locker(&m_mutex);
if(!locker.tryLock() )
{
return ;
}
//QMutex m_mutex;是window类的成员变量
void window::buttonSlot()
{
if(m_mutex.islock())
{
return ;
}
m_mutex.lock();
..
...
...
m_mutex.unlock();
}
Qt提供的QMutex和QMutexLocker都没有islock()方法,用bool QMutex::tryLock ()可以实现类似的功能。但是我的
buttonSlot()里有好几个return 语句,要是直接用QMutex,就必须在每个return 之前一一调用unlock(),好麻烦。
所以只好借鉴 QMutexLocker ,但是QMutexLocker 在构造的时候调用的是QMutex::lock ()会卡住,而我不需要卡住
,所以之后自己实现一个类似QMutexLocker 的锁CMutexLocker 。
{
public:
explicit CMutexLocker (QMutex *m)
{
m_isLocked = false;
if (m)
{
m_pLocker = m;
}
}
bool tryLock()
{
if (m_pLocker)
{
m_isLocked = m_pLocker->tryLock();
}
return m_isLocked;
}
bool tryLock( int timeout)
{
if (m_pLocker)
{
m_isLocked = m_pLocker->tryLock(timeout));
}
return m_isLocked;
}
~CMutexLocker ()
{
if (m_pLocker && m_isLocked)
{
m_pLocker->unlock();
}
}
protected:
private:
bool m_isLocked;
QMutex *m_pLocker;
};
只有用起来就简单了:不会卡住等待,也无需在每个return 之前调用unlock()那么麻烦了
void window::buttonSlot()
{
CMutexLocker locker(&m_mutex);
if(!locker.tryLock() )
{
return ;
}
}
0 0
- 自定义类似QMutexLocker的CMutexLocker
- QMutexLocker
- QMutexLocker
- 自定义类似ImageView的控件
- 自定义类似ViewPager的效果的ViewGroup
- 类似toggleButton效果的自定义按钮
- Android自定义类似ProgressDialog效果的Dialog
- 自定义Dialog实现类似Toast的功能
- Android自定义类似ProgressDialog效果的Dialog
- Android自定义类似ProgressDialog效果的Dialog
- Android自定义类似ProgressDialog效果的Dialog
- Android自定义类似ProgressDialog效果的Dialog
- Android自定义类似ProgressDialog效果的Dialog
- Android自定义类似ProgressDialog效果的Dialog
- Android自定义类似ProgressDialog效果的Dialog
- 自定义uiview 实现类似alertview的效果
- Android自定义类似ProgressDialog效果的Dialog
- Android自定义类似ProgressDialog效果的Dialog
- Linux下利用openssl对文件进行加密和解密
- Linux 挂载分区及开机自动挂载设置
- linux远程同步工具rsync
- 动态投影
- 未能加载文件或程序集System.Data,Version=2.0.0.0解决方法
- 自定义类似QMutexLocker的CMutexLocker
- UILabel的宽度自适应文字
- 坑爹的动车订票网站
- GOOGLE被封、GMAIL.COM邮箱、GMAIL登录不了的办法
- 云中消失的服务(总结版)
- LeetCode | Permutations
- easyui获取当前点击对象tabs的title
- java日期/时间浅谈
- QTableWidget行选中/删除/添加行