双实例运行/ 2 Game.exe一次

时间:2017-11-12 12:22:36

标签: c++ winapi

我要求一点帮助。关于我的Game.exe中的CreateMutex,我希望运行双实例或运行两(2)个相同的Game.exe但不超过这个。截至目前,这是我的代码

const char szUniqueNamedMutex[] = "Game.exe";
HANDLE hHandle = CreateMutex( NULL, TRUE, szUniqueNamedMutex );
}
if( ERROR_ALREADY_EXISTS == GetLastError() )
{
MessageBox ( NULL,"Game is already executed, Multiple Execution is 
prohibited!", "Game.exe", MB_OK );
return FALSE; // Exit program
}

当前代码只能运行一个实例或Game.exe

TIA。我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

以您的方式使用互斥锁只允许一次运行1个应用实例,无论互斥锁的所有权如何。

要允许运行有限数量的应用实例(在您的情况下,0< X< = 2),请使用semaphore代替:

  

信号量对象在控制可支持有限数量用户的共享资源时非常有用。它充当一个门,将共享资源的线程数限制为指定的最大数量。例如,应用程序可能会限制它创建的窗口数。它使用最大计数等于窗口限制的信号量,每当窗口创建时递减计数,并在窗口关闭时递增计数。应用程序在创建每个窗口之前指定调用其中一个等待函数的信号量对象。当计数为零时 - 表示已达到窗口限制 - 等待功能阻止执行窗口创建代码。

例如:

const char *szUniqueNamedSemaphore = "Game.exe";
HANDLE hHandle = CreateSemaphore(NULL, 2, 2, szUniqueNamedSemaphore); 
if (!hHandle) {
    MessageBox(NULL, "Unexpected error creating Execution semaphore!", "Game.exe", MB_OK);
    return FALSE;
}
if (WaitForSingleObject(hHandle, 0) != WAIT_OBJECT_0) {
    MessageBox(NULL, "Game is already running 2 times, additional Execution is prohibited!", "Game.exe", MB_OK);
    return FALSE;
}

... run the game logic ... 

ReleaseSemaphore(hHandle, 1, NULL);

成功等待信号量减少其计数器。对ReleaseSemaphore()的调用会增加计数器。当信号计数器> 1时,信号通知的状态发出信号。为0时无信号,