📄 15.5 保证应用程序只青一个实例运行.txt
字号:
15.5 保证应用程序只青一个实例运行
不知道读者是否曾经注意过,在使用金山词霸时,同时只能运行一个金山词霸程序的实例。当多次
打开金山词霸程序时,它实际上是将先前已经运行的金山词霸实例激活,使其处于前台运行的程序。
对这种同时只能有应用程序的一个实例运行的功能,可以通过命名的互斥对象来实现。在调用
CreateMutex函数创建一个命名的互斥对象后,如果其返回值是一个有效的句柄,那么可以接着调用
GetLastError函数,如果该函数返回的是 ERROR_ALREADY_ EXISTS,就表明先前己经创建了这个命
名的互斥对象,因此就可以知道先前己经有该应用程序的一个实例在运行了。当然如果
GetLastError函数返回的不是 ERROR ALREADY_EXISTS,就说明这个互斥对象是新创建的,从而也就
知道当前启动的这个进程是应用程序的第一个实例。
下面,我们就为 MultiThread程序添加代码,以实现同时只能启动该程序的一个实例。修改后的 man
函数如例 15-7所示。
例 15-7
void maín ()
HANDLE hThread1;
HANDLE hThread2;
//创建线程
hThread1=CreateThread(NULL, 0, Fun1Proc ,NULL , 0,NULL);
hThread2=CreateThread(NULL, 0,Fun2Proc ,NULL , 0, NULL);
CloseHandle(hThread1);
CloseHandle(hThread2) ;
//创建互斥对象
hMutex=CreateMutex(NULL , TRUE , "tíckets") ;
if (hMutex)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{ cout<<"only one ínstance can run! "<<Emdl;
return;
WaitForSingleObject(hMutex, INFINITE) ;
ReleaseMutex(hMutex) ;
ReleaseMutex(hMutex) ;
Sleep(4000) ;
在上述例 15-7所示代码中,首先调用 CreateMutex函数创建一个命名的互斥对象,至于该对象的名
字,读者可以根据需要随意指定。接着,判断返回的互斥对象句柄( hMutex )是否有值,如果有值,
那么就调用 GetLastError函数,并对其返回值进行判断。如果判断出该函数返回的是
ERROR_ALREADY_EXISTS,那么说明该命名的互斥对象已经被创建了,也就说明已经有一个该程序的
实例在运行了,于是输出一行字符 :"only instance cm run!",提示用户同时只能运行该程序的一
个实例,然后程序立即返回,不再向下继续运行。
读者可以先运行一个 MultiThread程序的实例,然后再次运行该程序,这时程序会打印出: "only one
instance can run!"这行字符,如图 15.12所示。因为该程序在第二次运行时,它判断出先前已经
有一个该程序的实例在运行了,所以它就打印出那行提示字符并立即退出。这就是利用命名的互斥
对象实现同时只能有应用程序的一个实例在运行这一功能的方法。
图 15.12同时只能运行应用程序的一个实例
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -