控制程序的启动数量(限制游戏多开)
引言:
在PC端使用软件的过程中。有时开发人员会有类似限制程序启动数量的需求,如限制某程序在单一PC端的启动数量。或是为了统计PC端启动的程序数量等,显然须要一种“计数器”来统计程序的执行数量。
怎样对多个程序进行计数
在PC端使用软件的过程中。有时开发人员会有类似限制程序启动数量的需求,如限制某程序在单一PC端的启动数量。或是为了统计PC端启动的程序数量等,显然须要一种“计数器”来统计程序的执行数量。
怎样对多个程序进行计数
在启动多个程序时,因为程序隶属于不同的进程,常规的计数方法不能使用,那么怎样统计程序的启动的数量成为了难题。
以下介绍一种经常使用的方法——使用相互排斥量:
执行结果
![]()
至于启动数量的限制,写在代码中显然不是一种优雅的做法,更通用的做法是通过启动程序的命令行參数传入程序。当限制程序数量须要改变时。仅修改命令行就可以达到要求。无需修改代码。
#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std;
class MaxClientLimitInstance
{
public:
static bool Lock(int MaxInstanceCount)
{
int ret = 0;
for(int i = 0; i < MaxInstanceCount; ++i)
{
HANDLE h = ::CreateMutex(0, 1, L"test program");
if (GetLastError() == 0)
{
m_Handle = h;
break;
}
else
{
CloseHandle(h);
ret++;
}
}
return ret < MaxInstanceCount;
}
static void UnLock()
{
if (m_Handle != NULL)
{
ReleaseMutex(m_Handle);
CloseHandle(m_Handle);
}
}
static HANDLE m_Handle;
};
HANDLE MaxClientLimitInstance::m_Handle = 0;
int _tmain(int argc, _TCHAR* argv[])
{
int MaxNumber = 1;
if (!MaxClientLimitInstance::Lock(MaxNumber))
{
cout << "You have already run a program! This program will be closed." << endl;
system("pause");
return 0;
}
else
{
cout << "Run program success! " << endl;
}
system("pause"); //< 等待用户输入,在游戏程序中能够相应理解为在游戏主循环中运行逻辑
MaxClientLimitInstance::UnLock(); //< 注意。要在“等待用户输入"之后ReleaseMutex,否则相互排斥量被释放,无法达到预期
return 0;
}
执行结果
至于启动数量的限制,写在代码中显然不是一种优雅的做法,更通用的做法是通过启动程序的命令行參数传入程序。当限制程序数量须要改变时。仅修改命令行就可以达到要求。无需修改代码。
浙公网安备 33010602011771号