zoukankan      html  css  js  c++  java
  • 控制程序的启动数量(限制游戏多开)

    引言
    在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;
    }
    
    
    


    执行结果


    至于启动数量的限制,写在代码中显然不是一种优雅的做法,更通用的做法是通过启动程序的命令行參数传入程序。当限制程序数量须要改变时。仅修改命令行就可以达到要求。无需修改代码。
  • 相关阅读:
    分布式锁实战,分布式锁方案选择
    数据库索引调优技巧
    GraphQL
    PDF添加水印
    word添加水印,.NET执行宏
    『OpenCV』在Cmake中设置指定的OpenCV路径
    『论文笔记』ArcFace: Additive Angular Margin Loss for Deep Face Recognition
    Dapr微服务应用开发系列3:服务调用构件块
    ClearLinux安装教程
    tail命令学习实例
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7395296.html
Copyright © 2011-2022 走看看