控制程序的啟動數量(限制遊戲多開)
阿新 • • 發佈:2017-08-19
strong err mod ucc pan 會有 sys ready 命令行
引言:
在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; }
執行結果
至於啟動數量的限制,寫在代碼中顯然不是一種優雅的做法,更通用的做法是通過啟動程序的命令行參數傳入程序。當限制程序數量須要改變時。僅修改命令行就可以達到要求。無需修改代碼。
控制程序的啟動數量(限制遊戲多開)