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

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;
}
http://www.lryc.cn/news/311356.html

相关文章:

  • Installing Git (安装 Git)
  • Android 拍照本地图片选择框架适配
  • 06 - ip route和route -n的区别
  • JAVA设计模式——单例模式
  • 分巧克力 刷题笔记
  • Python图像处理【21】基于卷积神经网络增强微光图像
  • 【嵌入式——QT】QTreeWidget
  • SQL 术语:Join 中的 Build 和 Probe 是什么意思?
  • HTTP头部信息解释分析(详细整理)
  • 探究短链接生成算法
  • golang 实现http请求的调用,访问并读取页面数据和内置的一些方法
  • FFmpeg+OpenCV开发案例汇总
  • PySide6+VSCode Python可视化环境搭建
  • 【设计】设计一个web版的数据库管理平台后端精要
  • 没有硬件基础可以学单片机吗?
  • ChatGPT引领的AI面试攻略系列:cuda和tensorRT
  • 【战略前沿】人形机器人制造商Figure获得了OpenAI、Jeff Bezos、Nvidia和其他科技巨头的资助
  • 多块磁盘组磁盘离线导致VSAN存储崩溃的VSAN数据恢复案例
  • Jenkins 的安装(详细教程)
  • 使用html网页播放多个视频的几种方法
  • python 基础知识点(蓝桥杯python科目个人复习计划58)
  • 【基于React实现共享单车管理系统】—React基础知识巩固(二)
  • 云桥通+跨境电商:SDWAN企业组网优化跨境网络案例
  • 服务器有几种http强制跳转https设置方法
  • web坦克大战小游戏
  • 如何使用生成式人工智能探索视频博客的魅力?
  • gpt批量工具,gpt批量生成文章工具
  • Python知识汇总
  • WEB面试题
  • Android Studio 六大基本布局详解