您的位置:首页 > 其它

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

2013-06-04 14:50 357 查看
在编程中如果不做处理的话,那么程序在运行一次之后还可以重复运行产生多个实例,这往往不是我们希望的,特别是对于一些无窗口的应用程序,多个程序在后台运行而我们却发现不了,会造成系统资源浪费。所以我们需要使用一定的方法限制程序使之只产生一个实例,当程序已经运行时就不能再运行之或报告程序已经运行之类的错误。

使程序单实例方法不止一种,在此介绍使用互斥(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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: