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

    }

}