最近做项目遇到一个需求,有一个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的更多相关文章

  1. 在Eclipse中自定义类似syso的快捷代码模板

    sysout/syso syserr/ syse 点击菜单栏的“Window”->“Preferences”,打开“Preferences”对话框.在Preferences”对话框中点击“Jav ...

  2. Android自定义类似ProgressDialog效果的Dialog

    Android自定义类似ProgressDialog效果的Dialog. 方法如下: 1.首先准备两张自己要定义成哪样子的效果的图片和背景图片(也可以不要背景). 如我要的效果: 2.定义loadin ...

  3. 安卓自定义类似TabHost的导航栏

    有时候为了项目需要我们要自定义一些导航控件,类似下面这样. 下面给大家讲讲我是怎么实现的, 1.素材准备(这个都是美工的事情) 2.①资源文件共有五个 如下: activity_main_first. ...

  4. 自定义类似smarty模板

    自定义类封装模板解析功能 原理其实比较简单,就是把html文件解析为一个超级字符串,然后把类似{{$mytitle}}这种结构的变量进行替换(str_replace)当然,实际中这样做可能导致频繁的磁 ...

  5. 自定义类似MessageBox小窗体操作

    1.实际小窗体界面如下 2.代码如下 private void InputBox(string caption,string orderNo) { Form InputForm = new Form( ...

  6. jquery自定义类似$.ajax()的方法

    热腾腾的代码: <script type="text/javascript"> $.extend({ testgogo: function (options) { va ...

  7. 自定义spring参数注解 - 打破@RequestBody单体限制

    本文主要描述怎样自定义类似@RequestBody这样的参数注解来打破@RequestBody的单体限制. 目录1 @RequestBody的单体限制2 自定义spring的参数注解3 编写sprin ...

  8. UWP开发入门(四)——自定义CommandBar

    各位好,再次回到UWP开发入门系列,刚回归可能有些不适应,所以今天我们讲个简单的,自定义CommandBar,说通俗点就是自定义类似AppBarButton的东西,然后扔到CommandBar中使用. ...

  9. JSP2.2自定义标签、EL函数

    简介 JSTL是一个JSP标准标签库,可以解决大部分问题,但是如果我们需要一些更特殊的功能,就需要自定义类似JSTL中标签的标签.如果EL表达式无法满足我们的需求,我们也可以自定义EL函数. tld后 ...

随机推荐

  1. 改变status bar的状态

    两种改变status bar状态的方法 一 :(全局的) 直接在当前控制器中(一般是在navigationcontroller) //- (UIStatusBarStyle)preferredStat ...

  2. MAVEN入门(二)

    一.IDEA+MAVEN+Tomcat7 创建一个简单的Web app 1.用IDEA创建一个maven项目 注意: 红色部分一定要自己手选本地配置好的maven_home的地址,否则IDEA会选用内 ...

  3. linux账户管理(centos)

    1./etc/passwd 非常详细的/etc/passwd解释 http://luzl.iteye.com/blog/564404 vi /etc/passwd,可以看到如下信息,在最后一行可以看到 ...

  4. WRTnode 的 HTTP Web 开关实验(2016-05-16)

    前言 这里是节取自 物联网的任意门——WRTnode2R 评测 中的 http web 开关灯实验,所以有一些前置设置如果没有描述清楚可参考该处. 正文 步骤一:编辑一个 html 文件,放在 /ww ...

  5. PreTranslateMessage和TranslateMessage区别(转)

    PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码. ...

  6. CentOS6.5安装Python2.7和Pip

    注:文中所写的安装过程均在CentOS6.5 x86下通过测试,安装的Python版本为2.7.12,Pip版本为8.1.2 主要参考博文:http://bicofino.io/2014/01/16/ ...

  7. windos下安装PEAR 注意

    1.在这里下载PEAR http://pear.php.net/go-pear.phar 在页面右键另存为 go-pear.phar 到PHP的根目录,并去目录查看是否保存为了go-pear.phar ...

  8. jquery-1.10.2.min.js之Multiple markers at this line

    1.windows-preferences  输入validation 2. 点击进入  3. 将JavaScript validator for js files 的两个对勾去了就OK!     4 ...

  9. Python: 在Unicode和普通字符串之间转换

    Unicode字符串可以用多种方式编码为普通字符串, 依照你所选择的编码(encoding): <!-- Inject Script Filtered --> Toggle line nu ...

  10. 深入探究VC —— 编译器cl.exe(1)

    cl.exe的功能是将源代码文件编译为可提供链接器使用的obj对象文件.cl.exe命令行参数形式如下: CL (option...) file... [option | file]... [lib. ...