各种语言Mutex(互斥)实现程序单实例运行

  在编程中如果不做处理的话,那么程序在运行一次之后还可以重复运行产生多个实例,这往往不是我们希望的,特别是对于一些无窗口的应用程序,多个程序在后台运行而我们却发现不了,会造成系统资源浪费。所以我们需要使用一定的方法限制程序使之只产生一个实例,当程序已经运行时就不能再运行之或报告程序已经运行之类的错误。
       使程序单实例方法不止一种,在此介绍使用互斥(Mutex)来实现程序单实例运行的方法。Mutex本来是多线程同步用的,防止多个线程访问同一资源而引发冲突。
( 1 ) VC++
在程序初始化实例代码中加入以下代码:
    HANDLE hMutex=CreateMutex(NULL,FALSE,"newMutex");//命名Mutex是全局对象,防止程序重复运行 ,互斥名为newMutex  
    //在所有的process都可以访问到    
    if(hMutex==NULL|| ERROR_ALREADY_EXISTS==::GetLastError())
   {    
         //程序第二次或以后运行时,会得到Mutex已经创建的错误
        ...
        return FALSE;    
    }  
( 2 ) C#.NET
在C#程序入口点main程序断段中加入如下代码:
   bool newMutex;  //定义bool变量newMutex
   Mutex m = new Mutex(true, "MutexForm", out newMutex);  //创建Mutex,互斥名为MutexForm
   if (newMutex)  //判断Mutex创建是否成功
   {
          Application.Run(new FormLogin());  //如果创建成功运行主程序
          m.ReleaseMutex();   //释放Mutex
    }

( 3 ) Dephi
    procedure tmainform.formcreate(sender: tobject);
    var
    mutexname: string;//互斥元名
    hprevwnd, hdata: hwnd; //hprevwnd---窗口句柄, hdata---getprop返回的属性值
    result: tmodalresult;
    logindlg: tloginform;
    begin
    mutexname := application.exename; //以应用程序名作为互斥名
    //创建互斥元.如果互斥元已经存在,这就是应用程序的第二个事例.
    //注意:当应用程序结束时,互斥元自动关闭.
    createmutex(nil, true, pchar(mutexname));
    if (getlasterror() = error_already_exists) then
    begin
        ...
    end;
     ...
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值