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

【Qt学习】10 利用QSharedMemory实现单例运行

问题

让应用程序只有一个运行实例
QSharedMemory除了可以完成进程间通信,还可以实现应用程序单例化。

解法


首先,看看QSharedMemory的几个函数:

1、QSharedMemory(const QString &key, QObject *parent = Q_NULLPTR)构造函数

该构造函数为给定的parent指针构造共享内存对象,并以key作为该对象的键值。

2、bool create(int size, AccessMode mode = ReadWrite) 函数

该函数为标识了键值key的共享内存对象创建内存空间。size是向系统申请的内存空间大小(即字节数),存取方式mode 默认为ReadWrite。

3、bool attach(AccessMode mode = ReadWrite) 函数

该函数将进程和标识了键值key的共享内存进行绑定。如果未调用create申请共享内存空间,则无法调用attach进行绑定。返回false。

方法一、利用共享内存不能重复Create。

代码如下。

#include "mainwindow.h"
#include <QApplication>
#include <QSharedMemory>
#include <QMessageBox>
#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);QSharedMemory *sharedMemory = new QSharedMemory(QString("Single.exe"));if (sharedMemory->create(1)){MainWindow w;w.show();return a.exec();}else{qDebug()<<"Has running";QMessageBox::information(0, "提示", "程序已运行!");}delete sharedMemory;sharedMemory = NULL;
}

效果:

​​​​​​​

方法二、未创建共享内存,不能Attach。

#include <QApplication>
#include <QSharedMemory>
int main(int argc, char *argv[])
{//通过共享内存,让程序只产生一个运行实例QSharedMemory shared("MainWindow.exe");//该共享内存键值为MainWindow.exeif(shared.attach(QSharedMemory::ReadOnly))//利用attach无法绑定未申请内存空间的特点判断该应用程序是否唯一{return 0;//非唯一,结束程序运行}shared.create(1);//创建共享内存,空间大小为1字节QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

参考:

https://blog.csdn.net/qq_42113801/article/details/113957610

http://www.lryc.cn/news/147735.html

相关文章:

  • FPGA应用于图像处理
  • vscode python 无法引入上层目录解决
  • [开发|java] java list 取某个属性最大的项
  • 关闭浏览器的跨域校验
  • USRP 简介,对于NI软件无线电你所需要了解的一切
  • RTE_Driver驱动框架和Keil下开发需要支持的xxx_DFP软件包分析
  • ImportError: Cannot load dynamic library. Did you compile LSD?
  • 音频应用编程
  • 软件测试/测试开发丨Python 学习笔记 之 链表
  • Matlab 使用经验分享(常用函数介绍;矩阵常见计算)
  • 软件工程(十七) 行为型设计模式(三)
  • 在抖音中使用语聚AI,实现自动回复用户视频评论、私信问答
  • pyqt5-快捷键QShortcut
  • 匿名函数( lambda 表达式)
  • 基于SSM的汽车维修管理系统——LW模板
  • Ceph的纠删码特性 EC(Erasure Code)代码流程
  • 盘点那些国际知名黑客(上篇)
  • 机器学习基础12-Pipeline实现自动化流程处理(基于印第安糖尿病Pima 数据集)
  • Ansible学习笔记15
  • 圆圈加数字的css
  • YOLOV5/YOLOV7/YOLOV8改进:用于低分辨率图像和小物体的新 CNN 模块SPD-Conv
  • Docker数据管理(数据卷与数据卷容器)
  • 大量TCP连接滞留TIME_WAIT、SYN_SENT、CLOSE_WAIT状态的分析
  • kotlin怎么定义类
  • 如何查看数据集下载后保存的绝对路径?
  • 使用php实现微信登录其实并不难,可以简单地分为三步进行
  • 【LeetCode-中等题】24. 两两交换链表中的节点
  • 5.10 汇编语言:汇编过程与结构
  • 【每日一题Day304】LC1267统计参与通信的服务器 | 哈希表
  • 深度解读零信任身份安全—— 全面身份化:零信任安全的基石