最近做项目遇到一个需求,有一个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 ()会卡住,而我不需要卡住
,所以之后自己实现一个类似QMutexLocker 的锁CMutexLocker 。
class 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 ;
}
}