当前位置: 首页 > article >正文

Qt 使用共享内存的方式限制程序单一启动

  • 当我们想让程序只可以启动一个,防止多个启动时,可以使用共享内存QSharedMemory的方式现实。
  • 代码如下,注意uniqueId要唯一
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QString uniqueId = "AppId";
    QSharedMemory sharedMemory(uniqueId);

    // 尝试附加到共享内存
    if (sharedMemory.attach())
    {
        qint64 *runningInstance = static_cast<qint64 *>(sharedMemory.data());
        if (runningInstance && *runningInstance != 0)
        {
            // 检查进程ID是否有效
            QProcess process;
            process.start("pidof", QStringList() << QString::number(*runningInstance));
            process.waitForFinished();
            if (!process.readAllStandardOutput().isEmpty())
            {
                // 进程ID有效,说明有实例在运行
                QMessageBox::warning(nullptr, QObject::tr("警告"),
                                     QObject::tr("程序已经在运行!"));
                sharedMemory.detach();
                return 0;
            }
        }
        // 进程ID无效或共享内存内容为0,说明没有实例在运行
        sharedMemory.detach();
    }

    // 尝试创建共享内存段,大小为sizeof(qint64)
    if (sharedMemory.create(sizeof(qint64)))
    {
        qint64 *runningInstance = static_cast<qint64 *>(sharedMemory.data());
        *runningInstance = QCoreApplication::applicationPid();
        // **** 窗口启动代码*****//
		//******************//
		//******************//
		//******************//
        //******* end ********//
        //  程序正常退出时,设置共享内存内容为0
        QObject::connect(&a, &QApplication::aboutToQuit, [&]()
                         {
            if (sharedMemory.isAttached())
            {
                qint64 *runningInstance = static_cast<qint64*>(sharedMemory.data());
                if (runningInstance) *runningInstance = 0;
                sharedMemory.detach();
            } });

        return a.exec();
    }
    else
    {
        QMessageBox::information(nullptr, QObject::tr("提示"),
                                 QObject::tr("程序已经在运行!"));
        return 1;
    }
}



http://www.kler.cn/a/507941.html

相关文章:

  • 2025.1.15——四、布尔注入
  • 读《SQL经典实例》学数据库(系列一)
  • 攻防世界 unseping
  • 【 MySQL 学习2】常用命令
  • 【Block总结】掩码窗口自注意力 (M-WSA)
  • JAVA实现五子棋小游戏(附源码)
  • 深入内核讲明白Android Binder【二】
  • 【JVM-8】使用 IBM Thread and Monitor Dump Analyzer for Java (TMDA) 分析线程转储
  • 深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术
  • 修复5.0.0r 64位版本浏览器和一些库找不到的问题
  • Flink (九):DataStream API (六) Process Function
  • 如何在 Google Cloud Shell 中使用 Visual Studio Code (VS Code)?
  • Spring Boot与MyBatis
  • FPGA:Quartus软件与操作系统版本对照表
  • Java 开发常见面试题3
  • ORB-SLAM2源码学习: Frame.cc: cv::Mat Frame::UnprojectStereo将某个特征点反投影到三维世界坐标系中
  • “云计算+中职”:VR虚拟仿真实训室的发展前景
  • VS2022——WPF初始化和控件Nmae虚假报错
  • 在 JIRA 中利用仪表盘功能生成 Bug 相关图表的手册
  • 无人机(Unmanned Aerial Vehicle, UAV)路径规划介绍
  • Qotom Q10922H6 N100多网口无风扇迷你电脑2个10G和4个2.5G网口
  • Android SystemUI——NavigationBar导航栏(七)
  • 39.【4】CTFHUB web sql 布尔注入
  • 客户案例:致远OA与携程商旅集成方案
  • python之二维几何学习笔记
  • 简单介绍JSONStream的使用