最近做项目遇到一个需求,有一个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. liquibase之快速入门

    第一步: 创建一个Changelog File: 这个database  Changelog file列举了数据库中所有的改变情况,该文件是以xml为基础的,下面是一个空的xml文件: <?xm ...

  2. vue开发体验

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  3. YIi配置debug工具、yii配置gii工具

    $config['bootstrap'][] = 'debug';$config['modules']['debug'] = [ 'class'=>'yii\debug\Module', 'al ...

  4. 第三章 视图和URL配置

    在Mysite文件夹中,创建一个views.py的空文件,输入: from django.http import HttpResponse def hello(request): return Htt ...

  5. QT学习 之 三维饼图绘制

    QT里没有相应统计图形的绘制组件 只有手工自己画 效果如图 void aaq::paintEvent( QPaintEvent* ev ) { QPainter painter(this); // 去 ...

  6. Multiple markers at this line @Override的解决方法

    Multiple markers at this line - implements java.awt.event.ActionListener.actionPerformed - The metho ...

  7. 【剑指Offer学习】【面试题18 :树的子结构】

    题目:输入两棵二叉树A 和B.推断B 是不是A 的子结构. 二叉树结点的定义: /** * 二叉树的树结点 */ public static class BinaryTreeNode { int va ...

  8. android 实现蓝牙自动配对连接

    BluetoothConnectActivityReceiver.java:监听蓝牙配对的广播 代码: package com.imte.Broadcast; import com.imte.util ...

  9. ThinkPHP - 登录流程

    数据库: /* Navicat MySQL Data Transfer Source Server : 本地连接 Source Server Version : 50710 Source Host : ...

  10. [Swust OJ 648]--简单字典(数位dp)

    题目链接:http://acm.swust.edu.cn/problem/0648/ Time limit(ms): 1000 Memory limit(kb): 65535   有这样一本字典,它每 ...