qt程序设置同时只能运行一个,避免重复打开

2023-11-01


[1] qt程序设置同时只能运行一个,避免重复打开

原文链接:https://blog.csdn.net/WMT1520/article/details/127207867

在main.cpp文件中加入以下头文件

//头文件
#include <QSharedMemory>
#include <QMessageBox>

在主界面显示之前,创建共享内存块,并进行判断

    static QSharedMemory *singleApp = new QSharedMemory("SingleApp");//创建“SingleApp”的共享内存块
    if(!singleApp->create(1))//创建失败,说明已经有一个程序运行,
    {
        QMessageBox::information(NULL,"tips","The program is already running");//弹出提示框 注意:该提示应该在 qApp->quit();之前,否则提示框将会一闪而过
        qApp->quit();//退出当前程序
        return -1;
    }

在这里插入图片描述
QSharedMemory的使用参考:https://doc.qt.io/qt-6/qsharedmemory.html

[2] Qt 桌面软件防止重新启动

原文链接:https://blog.csdn.net/xiezhongyuan07/article/details/120286676

越来越多的 windows 桌面程序要求防止重复启动,或者说只允许同时启动一个。实现方式有很多,我们接下来梳理一下常用的做法:

一、创建互斥量

原理:使用 windows 系统函数 CreateMutex ,一般根据唯一的应用程序的名称来找出当前系统中是否已经存在了指定进程的实例,如果没有,则会创建一个。

注意: 程序退出时,一定要调用CloseHandle(m_hMutex),不然后果很严重,可能导致以后的程序无法打开。

#include "stdafx.h"
#include "windows.h"
 
int main(int argc, char* argv[])
{
    HANDLE m_hMutex = CreateMutex(NULL, TRUE, "my_app_name");
    DWORD dwRet = GetLastError();
 
    if (m_hMutex) {
        if (ERROR_ALREADY_EXISTS == dwRet)
        {
            printf("程序已经在运行中了,程序退出!\n");
            CloseHandle(m_hMutex);
            return 0;
        }
    } else {
        printf("创建互斥量错误,程序退出!\n");
        CloseHandle(m_hMutex);
        return 0;
    }
 
    while(1) {
        printf("my_app_name\n");
    }
 
    CloseHandle(m_hMutex);
    return 0;
}

二、使用QLockFile 创建锁定文件,通过能否锁定来判断是否已经有程序启动。

原理:使用Qt 提供的对象 QLockFile。它提供一个文件的进程间的锁定。锁文件可用于防止多个进程同时访问统一资源。只有当访问共享资源的所有进程使用相同的文件路径的QLockFile时,才能保证序列化。 使用使用 tryLock() 函数来尝试锁定文件,锁定成功了,就说明没有已经启动的程序。锁定失败则表示已经有程序在启动了。

注意:

  1. 创建一个临时文件(一般创建在临时目录内)。

  2. 一般使用tryLock 要设置超时时间,时间一般不易过久。

#include <QApplication>
#include <QLockFile>
#include <QDir>
#include <QDebug>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QString tempPath = QApplication::applicationDirPath() + "/temp/";
    QString filePath = tempPath + "/" + "my_app_name" + ".app.lock";
    QLockFile *lockFile = new QLockFile(filePath);
 
    if (lockFile->tryLock(2000)) {
        qDebug() << "运行程序成功!";
    } else {
        qDebug() << "程序已经在运行中了,程序退出";
        return 0 ;
    }
 
    if (lockFile) {
        delete lockFile;
    }
 
    return a.exec();
}

三、使用 系统信号量 QSystemSemaphore 与 共享内存 QSharedMemory

原理:

  1. 信号量 QSystemSemaphore: 为系统级别信号量,可以再多个进程间使用。多个进程可以通过名字来操作一个信号量。创建时候需要指定一个mode,可以选择Open 和 Create 。其中,Open在请求的信号量已存在时,就使用它,并且不会重置信号的资源数,如果请求的信号量不存在,就 创建它并为它设置初始的资源值。而对于Create来说,不管请求的信号量是否已存在,它都会取得信号量的拥有权,并设置初始值。所以,我们应该在第一次创建信号量时,为其传入Create参数。但在Windows平台上,Create和Open的行为相同,因为,Windows平台上不存在应用程序崩溃后,信号量还存在的情况。

信号量简单的来说就是谁先请求,谁就可以继续操作,只有释放了之后,别的程序才可以继续。所以信号量也可以理解为一种简单的互斥锁,保护某种资源不会同时被多个程序操作。

使用系统信号量就是为了保护共享内存不会被多个进程同时操作。

注意:

信号量的启动 acquire() 和释放 release() 必须是成对出现。要保护资源的操作要在 acquire() 和 release() 中间操作。

#include <QApplication>
#include <QSharedMemory>
#include <QSystemSemaphore>
#include <QDebug>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    // 创建信号量
    QSystemSemaphore semaphore("myAppSemaphore", 1);
 
    // 启用信号量,禁止其他实例通过共享内存一起工作
    semaphore.acquire();
 
    // 创建一个共享内存  myAppName 可作为唯一程序的标识
    QSharedMemory sharedMemory1("myAppName");
 
    bool isRunning = false;
    // 试图将共享内存的副本附加到现有的段中。
    if (sharedMemory1.attach()) {
        // 如果成功,则确定已经存在运行实例
        isRunning = true;
    } else {
        // 否则申请一字节内存
        sharedMemory1.create(1);
        // 确定不存在运行实例
        isRunning = false;
    }
    semaphore.release();
 
    if (isRunning) {
        qDebug() <<  "程序已经在运行中了,程序退出";
        return 0;
    }
 
    return a.exec();
}

[3] Qt 编写的程序如何只能运行一个实例

https://blog.csdn.net/liyuanbhu/article/details/126563321

[4] linux qt 只运行一个实例,Qt 只运行一个程序实例

https://blog.csdn.net/weixin_34805229/article/details/116692219

[5] 测试例程

在这里插入图片描述

#include "mainwindow.h"

#include <QApplication>
#include <QSharedMemory>
#include <QMessageBox>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //检查程序是否唯一存在
    //创建“SingleApp”的共享内存块
    static QSharedMemory* singleApp = new QSharedMemory("SingleApp");
    if(!singleApp->create(1))
    {
        QMessageBox::warning(NULL, "警告", "this App is already running!"); //弹出提示框 注意:该提示应该在 qApp->quit();之前,否则提示框将会一闪而过
        a.quit();
        return -1;
    }

    MainWindow w;
    w.show();
    return a.exec();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt程序设置同时只能运行一个,避免重复打开 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy

随机推荐

  • mysql和m_MySQL-----(M-S,和,M-M)

    实验项目 一主多备 双主双备 一 一主多备 1 需要至少两台MySQL 一台主 一台备 在主备上创建数据库 mysql uroot p123 create databse HA use HA create table T1 id int n
  • 详解:字符转换函数(大写转小写,小写转大写)

    对于我们在刚刚学习C语言的时候的练习题 不知道大家还能记得多少 多组输入 输入一个英文字符 判断 如果是大写 则输出小写 如果是小写 则输出大写 这个题目 其实在刚刚开始学习的时候 为难了笔者老久都没有攻克 主要还是在于 回车键没有抵消 所
  • 使用OpenAPIKey来调用ChatGPT并解决生成回答控制台显示不全的问题

    使用OpenAPIKey来调用ChatGPT并解决生成回答控制台显示不全的问题 Code import os import openai import re def get ai response prompt engine text da
  • react-lazyload懒加载控件源码解析

    简介 本篇文章主要介绍一个优秀的基于react实现的懒加载控件 github com twobin reac 优点 易于使用 比如
  • 基于机器学习的心脏成像诊断

    心脏成像在心血管疾病 CVD 的诊断中起着重要作用 但到目前为止 它的作用仅限于对心脏结构和功能的观察和定量评估 然而 随着大数据和机器学习的出现 人工智能方法的出现将直接帮助临床医生诊断CVD 本文全面回顾了这一领域的最新研究成果 并为读
  • js数组去重常用方法

    js数组去重是面试中经常会碰到的问题 无论是前端还是node js数组常见的有两种形式 一种是数组各元素均为基本数据类型 常见的为数组字符串格式 形如 a b c 一种是数组各元素不定 元素中既有基本数据类型 也有引用数据类型 形式如 na
  • 某书最新版X-s(2023/5/23更新)

    前不久刚写过xhs的x s 前几天听一些小伙伴说又更新了 我二话不说还按原先的逆向思路 直接搜function sign 开始施展补环境大法 一顿无用的折腾 补完后 测试发现死活不成功 这真是离了大谱了 对比了一下 通过补环境 sign生成
  • 【linux】【tar】tar命令详解之czvf,xzvf

    Linux tar 英文全拼 tape archive 命令主要用于文件的打包压缩及解压 命令最初的设计目的是为了将文件备份到磁带上 tapearchive 因而得名tar 1 常用tar命令实例 打包命令 tar czvf xxx 说明
  • 代码布局优化

    代码布局优化是编译技术中的一种策略 其目的是调整程序中函数和数据的物理布局 以提高程序的执行速度 更好的代码布局能够有效利用现代处理器的特性 例如指令缓存和分支预测 从而提高性能 以下是代码布局优化的几个关键方面 指令缓存效率 当处理器执行
  • linux系统支持ntfs吗,Linux支持NTFS格式文件的方法

    一般情况下Linux系统是不支持NTFS文件系统的 所以我们不能在Linux系统中挂载NTFS文件系统类型的硬盘或移动硬盘 那么我们如何才能让Linux系统支持NTFS文件系统呢 现在我们去看看Linux支持NTFS格式文件的方法介绍 Li
  • VS 2022(Visual Studio 2022)菜单栏中增加文件-高级保存选项

    背景 最近想使用VS工具来开发Qt项目 但运行后发现程序运行中文会显示乱码 在网上找了相关资料后需要使用高级保存选项来更改文件编码为UTF 8类型 但VS2022貌似没有高级保存选项 摸索一番后发现添加该选项的方法 故而分享一下 参考连接
  • iwebsec靶场 文件包含漏洞通关笔记8-php://input伪协议利用

    目录 前言 1 php input伪协议原理 2 php input伪协议使用条件 第08关 php input伪协议利用 1 打开靶场 2 源码分析 3 伪协议渗透获取php信息 1 构造post信息 2 渗透 4 伪协议获取目录信息 1
  • 基础指针【指针的基本使用方法和注意事项】

    基础指针目录 前言 指针 指针是什么 指针的大小 指针的定义和赋值 指针的使用 传值调用和传址调用 传值调用 传址调用 指针的弊端 野指针 使用指针的注意事项 前言 指针 是我们在学习C语言中的一个重难点 关乎到我们学习C语言的深度和理解
  • module.exports、exports、export default、export、require、import

    在es5中 用 module exports 和 exports 导出模块 用 require 导入模块 在es6中 新增 export default 和 export 导出模块 用 import 导入模块 一般的 module expo
  • java 设置不缓存,java – 禁用通过外部属性的spring方法缓存

    我使用ehcache和注释驱动配置配置了 spring方法缓存 但是 我希望能够从我们在应用程序中使用的配置文件中禁用它 我的第一个想法是如果禁用方法缓存 则调用net sf ehcache CacheManager CacheManage
  • Vue3中的hook

    一 hook的基本使用 Vue3中的hook通常被称为Composition API 是Vue js框架中的一个重要特性 它们的本质是一些可以在组件内部使用的函数 这些函数能够让你在不影响组件逻辑的情况下 增强和扩展组件的功能 Hook的主
  • VS2015:当前不会命中断点,显示当前不会命中断点 没有与此行关联的可执行代码

    使用VS在Release模式下打断点进行调试 有时候不会命中断点 显示信息如下 当前不会命中断点 显示当前不会命中断点 没有与此行关联的可执行代码 这是因为Release模式下 编译器进行编译优化时 忽略掉了这个断点 为此需要 releas
  • ERROR: You must give at least one requirement to install (see "pip help install")

    使用pip install 命令时遇到You must give at least one requirement to install see pip help install 原因是install 后面没有参数 也就是说没有给想要安装的
  • 蓝牙AOA高精度定位

    01 蓝牙AOA定位技术原理 2019 年初 蓝牙技大联盟宣布蓝牙 5 1 引入了新的 寻向 功能 这个功能可检测蓝牙信号的方向 将大幅提高蓝牙定位的精确度 提供更好的位置服务 结束了以往通过 RSSI 信号强度的方式做低精度指纹定位的历史
  • qt程序设置同时只能运行一个,避免重复打开

    qt程序设置同时只能运行一个 避免重复打开 1 qt程序设置同时只能运行一个 避免重复打开 2 Qt 桌面软件防止重新启动 一 创建互斥量 二 使用QLockFile 创建锁定文件 通过能否锁定来判断是否已经有程序启动 三 使用 系统信号量