Qt 运行一个实例进程
QLocalSocket + QLocalServer
逻辑:首先一个新的实例启动时,将尝试连接到同一个本地服务器,如果连接失败,则表示第一个实例进程,创建一个本地服务器;否则,拉起已打开的实例进程。
main.cpp
#include <QApplication>
#include "main_windows.h"
#include "single_application.h"//QT启动屏蔽cmd
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")int main(int argc, char* argv[])
{//QApplication a(argc, argv);SingleApplication singleApplication(argc, argv);if (!singleApplication.IsRunning()){MainWindow mainWindow;mainWindow.show();singleApplication.m_mainWindow = &mainWindow;return SingleApplication::exec();}return 0;
}
single_application.h
//
// Created by zhe.xiao on 2024/3/1.
//#pragma once#include <QApplication>
#include <QWidget>
#include <QLocalServer>
#include <QLocalSocket>class SingleApplication : public QApplication
{
Q_OBJECT
public:SingleApplication(int& argc, char* argv[]);//是否已有实例在运行bool IsRunning();private://初始化本地连接void InitLocalConnection();//创建服务端void CreateLocalServer();//激活窗口void ActivateWindow();public://MainWindow指针QWidget* m_mainWindow;private://运行状态bool m_isRunning;//是否已有实例在运行QLocalServer* m_localserver;//本地socket ServerQString m_applicationName;//连接超时时间int m_timeout = 1000;private slots://有新连接时触发void OnNewConnection();
};
single_application.cpp
//
// Created by zhe.xiao on 2024/3/1.
//#include <QFileInfo>
#include "single_application.h"
#include <QDebug>SingleApplication::SingleApplication(int& argc, char* argv[]) : QApplication(argc, argv)
{m_isRunning = false;m_mainWindow = nullptr;m_localserver = nullptr;m_applicationName = QFileInfo(QApplication::applicationFilePath()).fileName();qDebug() << "m_serverName:" << m_applicationName;InitLocalConnection();
}/*** 通过socket通讯实现程序单实例运行,* 初始化本地连接,如果连接不上server,则创建,否则退出*/
void SingleApplication::InitLocalConnection()
{m_isRunning = false;//尝试连接本地服务器,如果连上了就触发OnNewConnection,QLocalSocket socket;socket.connectToServer(m_applicationName);if (socket.waitForConnected(m_timeout)){m_isRunning = true;return;}//首次打开exe连接不上,则需要先创建一个本地服务器CreateLocalServer();
}void SingleApplication::CreateLocalServer()
{m_localserver = new QLocalServer(this);connect(m_localserver, &QLocalServer::newConnection, this, &SingleApplication::OnNewConnection);if (!m_localserver->listen(m_applicationName)){// 此时监听失败,可能是程序崩溃时,残留进程服务导致的,移除if (m_localserver->serverError() == QAbstractSocket::AddressInUseError){QLocalServer::removeServer(m_applicationName);m_localserver->listen(m_applicationName); //重新监听}}
}/*** 通过socket通讯实现程序单实例运行,监听到新的连接【即重新双击exe】时触发该函数.*/
void SingleApplication::OnNewConnection()
{QLocalSocket* localSocket = m_localserver->nextPendingConnection();if (localSocket){localSocket->waitForReadyRead(m_timeout * 2);delete localSocket;//激活窗口ActivateWindow();}
}void SingleApplication::ActivateWindow()
{if (m_mainWindow != nullptr){m_mainWindow->raise();m_mainWindow->showNormal();m_mainWindow->activateWindow();}
}bool SingleApplication::IsRunning()
{return m_isRunning;
}
相关文章:
Qt 运行一个实例进程
QLocalSocket QLocalServer 逻辑:首先一个新的实例启动时,将尝试连接到同一个本地服务器,如果连接失败,则表示第一个实例进程,创建一个本地服务器;否则,拉起已打开的实例进程。 main.cpp #i…...
Installing Git (安装 Git)
Installing Git [安装 Git] 1. Installing Git1.1. Description1.2. Installing on Linux (在 Linux 上安装)1.3. Installing on macOS (在 macOS 上安装)1.4. Installing on Windows (在 Windows 上安装)1.5. Installing from Source (从源代码安装) 2. sudo apt-get install …...

Android 拍照本地图片选择框架适配
前言 通常技术方案的选择、会带来后续一些不可控的东西,这也是没法避免的,程序开发者中同时面对、测试、领导、产品各种要求。同时在网络上查找的资料也只是很旧的,不一定适合新设备,需要推倒重新弄 1、解决方案通过意图选择器做…...

06 - ip route和route -n的区别
1 ip route和route -n的区别 ip route 和 route -n 都是用于查看和管理Linux系统路由表的命令。但下面是它们的区别: ip route:是Linux系统中的现代工具,它属于iproute2套件;它提供了更多的选项,可以更精确地控制路由表…...
JAVA设计模式——单例模式
单例模式是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。单例模式通常用于需要在整个应用程序中共享某个资源或控制某个独占性资源的情况。 在单例模式中,通常会将类的构造函数设为私有&…...

分巧克力 刷题笔记
/* 分巧克力 解题思路 二分 直接检查看答案是否符合题目条件 对于一块边长分别为x 和y的巧克力\\ 假设我们输入检查的数为k 其能分割成的 k*k 的巧克力的块数为 (x/k)*(y/k) 因为c里面的除法是下取整的所以我们不用考虑奇偶数 是否能整除 将每一块巧克力能分成的k*k的巧克力…...

Python图像处理【21】基于卷积神经网络增强微光图像
基于卷积神经网络增强微光图像 0. 前言1. MBLLEN 网络架构2. 增强微光图像小结系列链接 0. 前言 在本节中,我们将学习如何基于预训练的深度学习模型执行微光/夜间图像增强。由于难以同时处理包括亮度、对比度、伪影和噪声在内的所有因素,因此微光图像增…...

【嵌入式——QT】QTreeWidget
QTreeWidget类是创建和管理目录树结构的类,QTreeWidget每一个节点都是一个QTreeWidgetItem对象,添加一个节点前需先创建。QTreeWidget类是一个便利类,它提供了一个标准的树widget,具有经典的基于item的界面,类似于Qt 3…...

SQL 术语:Join 中的 Build 和 Probe 是什么意思?
博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…...
HTTP头部信息解释分析(详细整理)
这篇文章为大家介绍了HTTP头部信息,中英文对比分析,还是比较全面的,若大家在使用过程中遇到不了解的,可以适当参考下 HTTP 头部解释 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型&#…...
探究短链接生成算法
1. 引言 在互联网时代,链接是连接用户和信息的桥梁,而长链接可能会因为过长、难记、不美观等问题影响用户体验,因此短链接的出现填补了这一空缺。短链接是将原始的长链接通过一定的算法转换成短字符串,从而实现了链接的简洁化&am…...
golang 实现http请求的调用,访问并读取页面数据和内置的一些方法
下午就不能好好学习一下golang,业务一直找个不停,自己定的业务规则都能忘得一干二净,让你查半天,完全是浪费时间。 golang实现访问并读取页面数据 package mainimport ("fmt""net/http" )var urls []string{…...
FFmpeg+OpenCV开发案例汇总
桌面共享工具(软编版) 桌面共享工具(DXGI硬编版) 智能广告大屏(可叠加透明广告) Android手机屏幕RTMP推流工具(推麦克风版) Android手机屏幕RTMP推流工具(推扬声器版…...

PySide6+VSCode Python可视化环境搭建
pip install pyside6 下载本期源码 vscode装一个PYQT Integration插件,设置好两个路径(下面有个脚本用于获取路径) 用everything的童鞋注意了:工具/选项/索引/强制重建 重启vscode可以看到,右击.ui文件时出现可以操作…...
【设计】设计一个web版的数据库管理平台后端精要
需求 springboot设计开发一个系统,在这个系统的数据库表中存放着2000个数据库实例,有MySQL、Oracle、sql server3种数据库类型,用户可以在页面上选择不同的实例,连接这些实例上的数据库,来执行业务sql 实现 Service…...

没有硬件基础可以学单片机吗?
没有硬件基础可以学单片机吗? 在开始前我分享下我的经历,我刚入行时遇到一个好公司和师父,给了我机会,一年时间从3k薪资涨到18k的, 我师父给了一些 电气工程师学习方法和资料,让我不断提升自己,…...
ChatGPT引领的AI面试攻略系列:cuda和tensorRT
系列文章目录 cuda和tensorRT(本文)AI全栈工程师 文章目录 系列文章目录一、前言二、面试题1. CUDA编程基础2. CUDA编程进阶3. 性能优化4. TensorRT基础5. TensorRT进阶6. 实际应用与案例分析7. 编程与代码实践8. 高级话题与趋势 一、前言 随着人工智能…...
【战略前沿】人形机器人制造商Figure获得了OpenAI、Jeff Bezos、Nvidia和其他科技巨头的资助
原文:Humanoid robot-maker Figure gets funding from OpenAI, Jeff Bezos, Nvidia, and other tech giants 作者:ASSOCIATED PRESS ———————————————— Figure成立不到两年,还没有商业产品,但正在说服有影响力的…...

多块磁盘组磁盘离线导致VSAN存储崩溃的VSAN数据恢复案例
VSAN简介: VSAN是以vSphere内核为基础进行开发、可扩展的分布式存储架构。VSAN存储层由VSAN控制和管理,VSAN存储层是通过vSphere集群主机中闪存和硬盘的存储空间构建的,供vSphere集群使用的统一共享存储层。 VSAN存储是一个对象存储ÿ…...

Jenkins 的安装(详细教程)
文章目录 一、简介二、安装前准备三、windows 安装与启动1. 方式一2. 方式二3. 方式三 四、创建管理员用户五、常用设置1. 配置镜像地址2. 更改工作目录3. 开启可注册用户4. 全局变量配置 一、简介 官网:https://www.jenkins.io 中文文档:https://www.j…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...