zoukankan      html  css  js  c++  java
  • 自定义类似QMutexLocker的CMutexLocker

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

  • 相关阅读:
    互联网秒杀设计
    生产者消费者模式实现
    Ping CAP CTO、Codis作者谈redis分布式解决方案和分布式KV存储
    VIM使用学习笔记 : 按键说明
    Cookie的有效访问路径
    简单的Cookie记录浏览记录案例
    认识Cookie和状态管理
    Java异常
    Java接口基础
    String常用方法
  • 原文地址:https://www.cnblogs.com/findumars/p/5176093.html
Copyright © 2011-2022 走看看