码迷,mamicode.com
首页 > 其他好文 > 详细

自定义类似QMutexLocker的CMutexLocker

时间:2016-02-01 20:56:11      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

最近做项目遇到一个需求,有一个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 ;
    }

}

http://blog.csdn.net/hai200501019/article/details/17525445

自定义类似QMutexLocker的CMutexLocker

标签:

原文地址:http://www.cnblogs.com/findumars/p/5176093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!