控制程序的启动数量(限制游戏多开)

Home / Article MrLee 2016-11-24 3455

在PC端使用软件的过程中,有时开发者会有类似限制程序启动数量的需求,如限制某程序在单一PC端的启动数量,或是为了统计PC端启动的程序数量等,显然需要一种“计数器”来统计程序的运行数量。
如何对多个程序进行计数 在启动多个程序时,由于程序隶属于不同的进程,常规的计数方法不能使用,那么如何统计程序的启动的数量成为了难题。 下面介绍一种常用的方法——使用互斥量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#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;
}

运行结果


至于启动数量的限制,写在代码中显然不是一种优雅的做法,更通用的做法是通过启动程序的命令行参数传入程序,当限制程序数量需要改变时,仅修改命令行即可达到要求,无需改动代码。

本文链接:https://it72.com/11337.htm

推荐阅读
最新回复 (0)
返回