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

Qt下让程序只运行一个实例,避免重复打开

参考
【实现QT单例程序 QSystemSemaphore QSharedMemory】
做了一点点更改,主要是在openEuler上用时遇到的一点问题。

QSharedMemory *unimem = nullptr;
void checkExist()
{QString memName = "SingleApp"; // 注意这名字要每个工程不一样,否则不同的exe可能会冲突// 信号量的意义,把操作共享内存的代码锁住。因为有可能同时点击2次APP, 防止并发QSystemSemaphore sema(memName + "Key", 1, QSystemSemaphore::Open);qDebug() << "sema.acquire:" << sema.acquire();#ifdef Q_OS_LINUX/* Windows平台上不存在应用程序崩溃后,共享内存段还存在的情况* LINUX应用程序崩溃后,共享内存段不会自动销毁,则该程序再次运行会出问题* 所以程序启动时先去检查是否有程序崩溃后还存留的共享内存段,如果有,先销毁,再创建*/QSharedMemory mem(memName);// 尝试将进程附加到共享内存段if (mem.attach()) {// 将共享内存与主进程分离, 如果此进程是附加到共享存储器段的最后一个进程,则系统释放共享存储器段,即销毁内容mem.detach();}else{// 假如权限不足的话,也是无法attach的qDebug() << "linux:" << mem.errorString();}
#endif/** 每个App打开的时候,获取一次共享内存。* 如果获取失败,说明是第一个启动的APP,直接创建共享内存就好了。假如创建失败,说明不是第一个,直接退出就好了。* 如果获取成功,说明不是第一个,也是直接退出就好了。* 保证App在系统里只能打开一个。*/unimem = new QSharedMemory(memName);bool isRunning = false;if (unimem->attach()) {isRunning = true;} else {bool ret = unimem->create(1);if(ret == false) // 主要是改了这里{qDebug() << "create uniMem:" << ret << unimem->error() << unimem->errorString();if(unimem->error() != QSharedMemory::NoError){isRunning = true;}}else{isRunning = false;}}sema.release();if (isRunning) {//        qWarning() << QStringLiteral("已经有一个实例在运行,即将退出");std::cout << QString("已经有一个实例在运行,即将退出").toLocal8Bit().data() << std::endl;exit(0);}
}

在主函数实例化Application后,调用即可。


int main(int argc, char *argv[])
{QApplication a(argc, argv);checkExist();...
}
http://www.lryc.cn/news/429040.html

相关文章:

  • 考研交流平台设计与实现(源码+lw+部署文档+讲解等)
  • 哈希表--有效的字母异位词
  • GC终结标记 SuspendEE 是怎么回事
  • Ubuntu 中GCC交叉编译工具链安装
  • JEXL(Java Expression Language)用法概览
  • NC 完全二叉树结点数
  • 点灯案例优化(二) 利用位运算修改特定位
  • 【C++备忘录】
  • java编程 斐波拉契数列算法集锦【斐波拉契数列】【下】【集合类】【Stream函数式编程】
  • 智慧园区三维可视化平台
  • Redis 有序集合【实现排行榜】
  • ORACLE数据库管理系统介绍
  • C# 中Linq探讨 Or条件拼接
  • 有关应用层面试题有关库的思维导体
  • 记一次 SAP BP 编号范围错误引发的一个问题 GET_NRIV_LINE
  • (17)ELK大型储存库的搭建
  • 每日一问:Kafka消息丢失与堆积问题分析(简化版)
  • C语言中函数sizeof和strlen区别
  • RAG与LLM原理及实践(14)---- Python + MinIO + Kafka进阶
  • 接口自动化-代码实现
  • 如何查看linux大文件
  • 生成式人工智能服务大模型备案答疑
  • QT-贪吃蛇小游戏
  • 虚幻5|AI视力系统,听力系统,预测系统(1)视力系统
  • IC rankIC
  • Windows服务器IIS7下如何查看真实报错原因
  • 深度学习设计模式之策略模式
  • Linux 下安装miniconda(少走弯路)
  • java ssl使用自定义证书
  • 【ARM+Codesys 客户案例 】基于RK3568/A40i/STM32+CODESYS开发的控制器在自动输送分拣系统上的应用,支持定制