要确保你的程序只能运行一个实例,你可以使用操作系统提供的机制来检查是否已经有一个实例在运行。在Windows平台上,通常的做法是使用命名互斥量(Mutex)。以下是如何修改你的 main()函数来实现这一点的示例:
#include <Windows.h>
#include <conio.h>
int FMOD_Main()
{// 尝试创建一个命名互斥量HANDLE mutexHandle = CreateMutex(NULL, TRUE, "Global\\SystemMutex");if (mutexHandle == NULL) {std::cerr << "无法创建互斥量。" << std::endl;return -1;}// 检查错误代码,看看是否因为互斥量已存在而失败if (GetLastError() == ERROR_ALREADY_EXISTS) {std::cerr << "System程序已经在运行中。" << std::endl;std::cout << "按任意键退出!" << endl;_getch();return -1; // 程序已经在运行中,退出当前实例}// 你的程序代码// ...// 在程序结束时释放互斥量CloseHandle(mutexHandle);return 0;
}
这段代码首先尝试创建一个名为 “Global\SystemMutex” 的互斥量。如果创建成功,它会检查 GetLastError 函数的返回值来确定互斥量是否因为已经存在而创建失败。如果是这种情况(ERROR_ALREADY_EXISTS),则表示程序的另一个实例已经在运行,当前实例应该退出。如果互斥量创建成功且之前不存在,程序会继续执行。在程序结束时,使用 CloseHandle 函数释放互斥量。
请注意,这种方法在多用户环境下可能需要调整,因为 “Global\” 前缀允许在所有用户会话中检测互斥量。如果你只想在当前用户会话中限制实例,可以省略 “Global\” 前缀。此外,确保你的程序在任何退出点都释放了互斥量,以避免资源泄露。
_getch() 函数用于等待用户按键,然后程序继续执行。这个函数是在 <conio.h> 头文件中定义的,通常用于控制台应用程序中,以便在不显示按键字符的情况下从键盘获取一个字符。