在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序。Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直接调用系统API,肯定可以做到,但是我们希望找到一个跨平台的通用的解决方案。

这就要用到Qt的QLocalSocket,QLocalServer类了,这两个类从接口上看和网络通信socket没有区别,但是它并不是真正的网络API,只是模仿了而已。这两个类在Unix/Linux系统上采用Unix域socket实现,而在Windows上则采用有名管道(named pipe)来实现。

既然是网络API,那么思路就很简单了,应用程序启动时首先会去连一个服务器(这里通过应用程序的名字来标识,就像网络端口一样),如果连接失败,那么则自己是第一个实例,就创建这么一个服务器,否则将启动参数发送到服务器,然后自动退出,而服务器会在收到通知以后进行处理。

这些动作我想最好是放在创建Application实例后,因为Qt本身有很多操作没有Application实例是无法进行操作的(至少事件循环是在创立Application以后才能启动吧),因此最好的位置就是通过继承QApplicaiton或者QCoreApplication自定义一个YourOwnApplication,然后在构造函数中进行,下面是一个示意。

QString serverName = QCoreApplication::applicationName(); QLocalSocket socket; socket.connectToServer(serverName); if (socket.waitForConnected(500)) { //如果能够连接得上的话,将参数发送到服务器,然后退出 QTextStream stream(&socket); QStringList args = QCoreApplication::arguments(); if (args.count() > 1) stream << args.last(); else stream << QString(); stream.flush(); socket.waitForBytesWritten(); qApp->quit(); return; } //运行到这里,说明没有实例在运行,那么创建服务器。 m_localServer = new QLocalServer(this); connect(m_localServer, SIGNAL(newConnection()), this, SLOT(newLocalSocketConnection())); //监听新到来的连接 if (!m_localServer->listen(serverName)) { if (m_localServer->serverError() == QAbstractSocket::AddressInUseError && QFile::exists(m_localServer->serverName())) { //确保能够监听成功 QFile::remove(m_localServer->serverName()); m_localServer->listen(serverName); } } // 这样就保证了新启动的程序在检测到有其他实例在运行时就会自动退出, // 但是它发出的请求还没有被处理, // 下面看一下处理函数,也就是前段代码中的newLocalSocketConnection()。 QLocalSocket *socket = m_localServer->nextPendingConnection(); if (!socket) return; socket->waitForReadyRead(1000); QTextStream stream(socket); //其他处理 delete socket; mainWindow()->raise(); //弹出窗口 mainWindow()->activateWindow(); //记得激活窗口哦

Qt的QSingleApplication也能实现这个功能

转载于:https://blog.51cto.com/seanyxie/1375906

Qt应用程序只运行一个实例相关推荐

  1. 转:让程序只运行一个实例的四种方法

    先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...

  2. 让Java程序只运行一个实例

    一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...

  3. 只运行一个实例的方法

    在VC++ 中编程中,只运行一个实例的方法主要有两类: 1 遍历当前的所有窗口,查找相同的实例.为了便于查找,一般要事先设一个查找标志. 2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例. ...

  4. 限制程序只打开一个实例(转载)

    当我们在做一些管理平台类的程序(比如Windows的任务管理器)时,往往需要限制程序只能打开一个实例.解决这个问题的大致思路很简单,无非是在程序打开的时候判断一下是否有与自己相同的进程开着,如果有,则 ...

  5. 只运行一个实例的写法

    有时我们需要只允许运行应用程序的一个实例,当进程启动时,如果发现应用程序的一个实例在运行,就自动停止运行.我们通常通过Mutex互斥体在Main函数中实现,通常的写法是: [STAThread] st ...

  6. 让你的程序只能运行一个实例

        先说一个循环系统进程的方法吧,             //首先取得你的程序当前进程             Process current = Process.GetCurrentProce ...

  7. 使用互斥体使程序只运行一个

    何为互斥体 引用了百科的话 互斥体实现了"互相排斥"(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)).互斥体禁止多个线程同时进入受保护的代码&qu ...

  8. c#,Winform同一系统中只运行一个实例。

    代码 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; na ...

  9. linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量

    //包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...

最新文章

  1. Spring Cloud【Finchley】-12使用Hystrix Dashboard实现Hystrix数据的可视化监控
  2. 服务器ghost到虚拟机,无需U盘用Ghost还原vmware内虚拟机系统的方法
  3. 数据解析系统中需改进的几点
  4. VS中添加第三方库及相对路径设置
  5. elementUI vue 编辑中的input的验证残留清除
  6. python爬取天气数据山东_Python的学习《山东省各城市天气爬取》
  7. c语言dll创建线程,教大家写一个远程线程的DLL注入,其实还是蛮简单的……………………...
  8. Bootstrap3 工具提示插件的事件
  9. python ico_Python协程asynico模块解读
  10. 再见,前端!别更新了,我是学不动了
  11. 「10」民主投票法——KNN的秘密
  12. 注意sizeof()返回的数无符号数,有符号数遇到无符号数时变成无符号数
  13. Atitit.java线程池使用总结attilax 1.1. 动态更改线程数量 1 1.2. code 1 三、线程池的原理 其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下
  14. springboot内存占用大_《SpringBoot整合redis、Scheduled/quartz定时任务》
  15. windows 域介绍
  16. JavaGuide--Java篇
  17. 压缩包文件解压找回密码
  18. 华为交换机重制_华为交换机恢复出厂设置的三种方法
  19. 2020大厂到底有多少程序员?腾讯研发人员占比68%
  20. (Python高级编程)第二章:Python中的魔法函数

热门文章

  1. WordPress主题-RiPro子主题|小八子主题v8.0版
  2. 最新emlog程序仿小刀模板源码
  3. 移动开发在路上-- IOS移动开发系列 多线程二
  4. .NET 项目开发总结
  5. Linux下命令行压缩照片或图片的脚本 (ImageMagick使用心得,convert,import,display实例)...
  6. UISlider 滑块控件—IOS开发
  7. SQL Server常用函数 -- 更新中
  8. QT 连接 sql server数据库 完整演示
  9. 数组算法 java 115918581
  10. 输出语句 WriteLine 与格式化输出 1006 c#