zoukankan      html  css  js  c++  java
  • 目的:让目标程序在内存中只有一个实例

    Q:为什么要实现这个目的??

    A:因为有些程序 需要使用电脑上面的硬件,比如串口 采集卡之类的。这样情况下,程序在内存里面就只能

    有一份,不然会抢夺硬件资源,造成各种问题。

    ××××××××××××××××××××××

    实现这个目的可能有很多种方式。不过此处我要使用的是CreateMutex()这个函数。

    这个函数被定义在Kernel32里面。这个中文意译就是创建一个互锁。

    函数原型:

    HANDLE CreateMutex( 
      LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 
      BOOL bInitialOwner, // 初始化互斥对象的所有者 
      LPCTSTR lpName // 指向互斥对象名的指针 
      );
    

      
      创建一个 互斥体(MUTEX) 
      返回值 
      Long,如执行成功,就返回互斥体对象的句柄;

    零表示出错。会设置GetLastError。即使返回的是一个有效句柄,但倘若指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS 
      参数表 
      参数 类型及说明 


      lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符 


      bInitialOwner Long,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有 


      lpName String,指定互斥体对象的名字。用vbNullString创建一个 未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符

    ××××××××××××××××××××××

    范例1:

    //设置应用程序只允许一个实例****************************************************
     	HANDLE m_hMutex=CreateMutexA(NULL,TRUE, m_pszAppName); 
        if(GetLastError()==ERROR_ALREADY_EXISTS) 
    	{ 
    		AfxMessageBox("程序已启动");
    		CloseHandle(m_hMutex);
    		m_hMutex  = NULL;
    		return FALSE; 
    	}
     	//设置应用程序只允许一个实例结束************************************************
    

     

    m_pszAppName是程序运行名字,m_pszAppName是const char* 类型的公有变量。

     

    ×××××××××××××××××××××××

    范例2:

    h_mutex1=CreateMutex(NULL,FALSE,"mutex_for_readcount");//创建一个互斥体 
    HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");// 检查错误代码 
    if (GetLastError() == ERROR_ALREADY_EXISTS) 
    { 
      // 如果已有 互斥量存在则释放句柄并复位互斥量 
      CloseHandle(m_hMutex); 
      m_hMutex = NULL; 
      // 程序退出 
      return FALSE; 
    }; 
    

      

    ×××××××××××××××××××××××××

  • 相关阅读:
    工厂方法模式
    代理模式
    观察者模式
    策略模式
    单例模式
    简单工厂模式
    lintcode:等价二叉树
    lintcode:被围绕的区域
    lintcode:二叉树的所有路径
    lintcode:快乐数
  • 原文地址:https://www.cnblogs.com/wenluderen/p/4770485.html
Copyright © 2011-2022 走看看