0
点赞
收藏
分享

微信扫一扫

Qt 利用共享内存实现一次只能启动一个程序(单实例运行)


Qt 利用共享内存实现一次只能启动一个程序(单实例运行)_QSharedMemory

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、名称或者其他能够保证唯一性的字符串。

Qt 利用共享内存实现一次只能启动一个程序(单实例运行)_Qt_02


举报

相关推荐

0 条评论