以前写单例模式时,考虑的单个类的单例,看看下面的代码如何实现单例类和主程序分离,便于复用
作者主要使用QLocalSocket和QLocalServer进行程序的注册和监听,所以再次有同名称的程序打看,就会给之前的程序发消息,令其主动弹出,而自身则悄然关闭,实现了单例运行程序。

singleinstance.h
/*LANShare - LAN file transfer.Copyright (C) 2016 Abdul Aris R. <abdularisrahmanudin10@gmail.com>This program is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program.  If not, see <http://www.gnu.org/licenses/>.
*/#ifndef SINGLEINSTANCE_H
#define SINGLEINSTANCE_H#include <QObject>
#include <QtNetwork/QLocalServer>/** SingleInstance, digunakan agar aplikasi hanya memiliki satu instance* yang berjalan disistem operasi*/
class SingleInstance : public QObject
{Q_OBJECTpublic:SingleInstance(const QString& id, QObject* parent = 0);~SingleInstance();QString getLastErrorString() const;bool start();bool hasPreviousInstance();Q_SIGNALS:void newInstanceCreated();private Q_SLOTS:void onNewConnection();private:QLocalServer mServer;QString mName;
};#endif // SINGLEINSTANCE_H
singleinstance.cpp
/*LANShare - LAN file transfer.Copyright (C) 2016 Abdul Aris R. <abdularisrahmanudin10@gmail.com>This program is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program.  If not, see <http://www.gnu.org/licenses/>.
*/#include <QtNetwork/QLocalSocket>#include "singleinstance.h"SingleInstance::SingleInstance(const QString& name, QObject* parent): QObject(parent), mName(name)
{connect(&mServer, &QLocalServer::newConnection, this, &SingleInstance::onNewConnection);
}SingleInstance::~SingleInstance()
{}QString SingleInstance::getLastErrorString() const
{return mServer.errorString();
}bool SingleInstance::start()
{mServer.removeServer(mName);return mServer.listen(mName);
}bool SingleInstance::hasPreviousInstance()
{QLocalSocket socket;socket.connectToServer(mName);return socket.waitForConnected();
}void SingleInstance::onNewConnection()
{emit newInstanceCreated();
}

这样我们只要需要单例的地方加上这句话,就可以实现对象的单例

    QObject::connect(&si, &SingleInstance::newInstanceCreated, [&mainWindow]() {mainWindow.setMainWindowVisibility(true);});

最后要了解这个QLocalSocket和QLocalServer是个啥?他们是进程通信用到的类。

进程通信(IPC)的方法有很多,项目开发中,需要根据业务需求来选择适合的IPC方式。所谓LocalSocket,其实就是在socket的基础上衍生出来的一种IPC通信机制。其旨在解决同一台主机上不同进程间互相通信的问题,不能像网络通信使用的socket一样实现不同主机间通信。但正因为这一点,它不需要经过网络协议栈,不需要打包拆包、计算校验,所以执行效率要更高。
参考网址:https://blog.csdn.net/m0_46577050/article/details/123499117

开源程序LAN_share 单例模式巧用相关推荐

  1. 快速建站的php开源程序

    很多国外开源程序并不太符合中国人的使用习惯,而国内有一些厂家或个人也做了一些不错的产品,不少程序是提供源代码下载的,虽然有些在许可协议上和开源许可证有些出入,但其在使用上还是挺符合中国人的使用习惯,今 ...

  2. 学校APP太难用,码农爸妈们自己做出开源程序,官方却要报警

    明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 因学校APP太难用,码农爸妈们自己开发开源版本,结果反遭官方报警. 这年头,养孩子的难度系数也太高了吧. 而且绝不是家长们吹毛求疵,是APP ...

  3. 从零开始成为一名开源程序员,其实只需要九步!

    探索技术世界,是一件非常令人兴奋的事情.你会发现有非常非常多的领域,等待你去学习,去深挖.如果有兴趣参与和帮助创造更好的功能,加入到开源的队伍当中,你知道要从哪里开始吗?第一步该做什么?第二十步又是什 ...

  4. 那些开源程序中让人叹为观止的代码 - 3 保持元素纵横比

    本专栏尝试记录并分享一些个人在学习和使用开源程序代码的过程中,经意或者不经意间看到的个人感觉比较有参考价值的代码片段.个人感觉,并不是说能写或者能看得懂一些晦涩难懂的代码段子,就可以成为向别人炫耀的资 ...

  5. php源代码compress,Php常见开源程序gzip网页压缩功能手动关闭或开启方法大全

    GZIP是个啥玩意?啥东西哈?据度娘说,gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序.网站配置或启动这个东东,可以得到加速网站访问的目的,这个是一个非常实用的功能.那么,无忧主机 ...

  6. 开源程序识别图像像素点_开源浏览器扩展程序,可放大图像

    开源程序识别图像像素点 您是否曾经浏览过网站并希望看到更大的图像? 这无时无刻不在我身上发生,要做到这一点并不总是那么容易. 有时,我在源代码中进行筛选,使用Ctrl + F搜索图像,复制图像源地址并 ...

  7. 程序开源与不开源区别_如何在公司中启动开源程序

    程序开源与不开源区别 许多互联网规模的公司,包括Google,Facebook和Twitter,都建立了正式的开源程序(有时也称为开源程序办公室,简称OSPO),这是公司内部支持开源消费和生产的指定场 ...

  8. 程序员里面开源_如何以开源程序员的身份开始

    程序员里面开源 展望技术世界是令人兴奋的. 它有很多运动部件,似乎您越深入挖掘它,它越深入,然后它就一直是乌龟 . 因此,技术也势不可挡. 如果您热衷于加入并帮助塑造现代世界的运作方式,那么从哪里开始 ...

  9. 程序开源与不开源区别_什么是开源程序办公室? 为什么需要一个?

    程序开源与不开源区别 开源计划办公室是任何现代公司必不可少的组成部分,其计划要有一个雄心勃勃的计划来影响软件生态系统的各个领域. 如果公司希望增加影响力,澄清其开源消息传递,最大化其项目影响力或提高其 ...

最新文章

  1. 同时支持三个mysql+sqlite+pdo的php数据库类_同时支持三个MySQL+SQLite+PDO的PHP数据库类...
  2. 陈春花:管理到底是什么?
  3. Linux 操作系统原理 — 文件系统 — 虚拟文件系统
  4. Linux grep命令分析以及C语言版本的实现
  5. python爬虫代码房-Python爬虫一步步抓取房产信息
  6. 怎么看到方法内引用方法的注释_开门就看到餐厅,玄关怎么设计?试试这3个方法,专为小户型设计...
  7. MySQL死锁如何处理
  8. 【转】对ASP.NET程序员非常有用的85个工具
  9. linux文件夹做链接,linux为什么不能给目录做硬链接
  10. pandas—总结(2) 数据读写 (更新中)
  11. 【bzoj1047】[HAOI2007]理想的正方形 二维RMQ
  12. ubuntu yum安装_ubuntu 制作本地yum仓库
  13. access无法 dolby_Win10专业版装不了dolby该怎么办?Win10 dolby音效驱动安装教程
  14. 通过url获取域名和协议,一级域名,二级域名 python
  15. c语言输出最大的数ns流程图_急!!!!c语言NS流程图
  16. 面试被问到平衡二叉树如何平衡?
  17. 单机塔防游戏推荐_给大家推荐六款爆好玩的塔防游戏
  18. android怎么用apk,手机如何安装APK应用教程 小白操作安卓系统教程 (全文)
  19. 新品发布会直播推广的优势
  20. 力扣 python刷题

热门文章

  1. Android 编程实用代码大全
  2. 祖源分析相关链接推荐
  3. Android 停车地图及停车导航,停车场蓝牙定位导航方案
  4. karas报错filename = 'fine_tuned_net.h5', file descriptor = 24, errno = 28, error message = 'No space l
  5. C++时间工具类——纳秒,微秒,毫秒,秒,日期
  6. 使用Android Studio做一个简易进制转换计算器
  7. /boot空间不足的解决办法
  8. jquery ajax golang,原生和jQuery的ajax用法-Go语言中文社区
  9. GOM客户端插件自动登录源码
  10. AKABEiSOFT2经典作品推荐 車輪の国、向日葵の少女( 攻略、汉化、特典、PSP转换器)...