Qt 利用共享内存实现一次只能启动一个程序
文章目录
- Qt 利用共享内存实现一次只能启动一个程序
- 摘要
- 利用共享内存实现一次只能启动一个程序
- 示例代码
关键字:
Qt
、
unique
、
单一
、
QSharedMemory
、
共享内存
摘要
今天接着在公司搞我的屎山代码,按照投资方的要求,我需要给我的程序加一个系统自检检测的功能,但是呢,我的程序已经很烂了,一度想重构了他,所以这里我就暂时吧这个功能做成了一个进程,这样就可以独立运行,等后期重构的时候,直接拷贝过去。
因为不可抗力的因素,我的代码无法直接分享,但是咱可以写Demo来说明白。
利用共享内存实现一次只能启动一个程序
记得之前写过一般基于Socket的功能,但是我翻我之前的文章没有发现这个东西。就不放链接了,这里感兴趣的下伙伴可以自行摸索下。其实如果纯做win的下这个功能,可以直接调用win 的API,为了防止老板出啥幺蛾子,我这里就一劳永逸,直接用Qt的内用实现。
为了确保Qt程序有且只有一个实例在运行,使用QSharedMemory
类来检查是否已经有一个实例在运行。QSharedMemory
是Qt中用于进程间共享内存的类,利用它在不同的程序实例之间共享一个小段内存。如果一个程序启动时发现这段共享内存已经被创建,那么它可以安全地假定已经有另一个实例在运行,并可以据此决定退出或采取其他措施
示例代码
#include <QApplication>
#include <QSharedMemory>
#include <QMessageBox>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建一个唯一标识符
QString uniqueId = "myUniqueAppId";
// 创建共享内存
QSharedMemory sharedMemory(uniqueId);
// 尝试附加到共享内存,如果附加失败,说明没有实例在运行
if (!sharedMemory.attach()) {
// 尝试创建共享内存段,大小为1字节
if (sharedMemory.create(1)) {
// 创建成功,说明当前没有其他实例在运行
// 在这里启动你的程序
} else {
// 创建共享内存失败,可能是权限问题等
QMessageBox::critical(nullptr, QObject::tr("Error"),
QObject::tr("Unable to create a single instance of the application."));
return 1;
}
} else {
// 能够附加到共享内存,说明已经有一个实例在运行
QMessageBox::warning(nullptr, QObject::tr("Warning"),
QObject::tr("An instance of the application is already running."));
return 0; // 退出程序
}
// 你的程序主逻辑
// ...
return app.exec();
}
这段代码首先试图附加到一个名为myUniqueAppId
的共享内存段。如果这一操作失败,它接着尝试创建这个共享内存段。如果创建成功,这表示当前没有其他程序的实例在运行,程序可以继续执行。如果附加成功,说明已经有一个实例在运行,此时可以显示一个错误消息并退出程序。
注意,这里的uniqueId
需要是一个对于你的应用来说唯一的标识符。通常,你可以使用应用的ID、名称或者其他能够保证唯一性的字符串。