在开发项目的工程中,我们经常希望只运行一个相同的Qt实例进程。当然也可以像类似QQ那样,同时登录多个不同的账号!为了避免这个问题,介绍以下几种用法,每一个解决方案都适用于特定的情况,所以必须尝试和适用合适的解决方案。

一:使用QLocalSocket

方式:首先一个新的实例启动时,将尝试连接到同一个本地服务器,如果连接失败,则表示第一个实例进程,创建一个本地服务器。否则,进行退出。

[cpp] view plaincopyprint?
  1. void MainWidget::initLocalConnection()
  2. {
  3. is_running = false;
  4. QCoreApplication::setApplicationName("localserver");
  5. QString serverName = QCoreApplication::applicationName();
  6. QLocalSocket socket;
  7. socket.connectToServer(serverName);
  8. if(socket.waitForConnected(500))
  9. {
  10. is_running = true;
  11. return;
  12. }
  13. //连接不上服务器,就创建一个
  14. server = new QLocalServer(this);
  15. connect(server, SIGNAL(newConnection()), this, SLOT(newLocalConnection()));
  16. if(server->listen(serverName))
  17. {
  18. //防止程序崩溃时,残留进程服务,移除之
  19. if(server->serverError() == QAbstractSocket::AddressInUseError && QFile::exists(server->serverName()))
  20. {
  21. QFile::remove(server->serverName());
  22. server->listen(serverName);
  23. }
  24. }
  25. }
  26. void MainWidget::newLocalConnection()
  27. {
  28. QLocalSocket *socket = server->nextPendingConnection();
  29. if(!socket)
  30. return;
  31. socket->waitForReadyRead(1000);
  32. delete socket;
  33. }
  34. bool MainWidget::isRunning()
  35. {
  36. return is_running;
  37. }
void MainWidget::initLocalConnection()
{
is_running = false;
QCoreApplication::setApplicationName("localserver");
QString serverName = QCoreApplication::applicationName();
QLocalSocket socket;
socket.connectToServer(serverName);
if(socket.waitForConnected(500))
{
is_running = true;
return;
}
//连接不上服务器,就创建一个
server = new QLocalServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(newLocalConnection()));
if(server->listen(serverName))
{
//防止程序崩溃时,残留进程服务,移除之
if(server->serverError() == QAbstractSocket::AddressInUseError && QFile::exists(server->serverName()))
{
QFile::remove(server->serverName());
server->listen(serverName);
}
}
}
void MainWidget::newLocalConnection()
{
QLocalSocket *socket = server->nextPendingConnection();
if(!socket)
return;
socket->waitForReadyRead(1000);
delete socket;
}
bool MainWidget::isRunning()
{
return is_running;
} 

main.cpp中:

[cpp] view plaincopyprint?
  1. MainWidget main_widget;
  2. if(!main_widget.isRunning())
  3. {
  4. main_widget.showNormal();
  5. main_widget.raise();
  6. main_widget.activateWindow();
  7. return app.exec();
  8. }
MainWidget main_widget;
if(!main_widget.isRunning())
{
main_widget.showNormal();
main_widget.raise();
main_widget.activateWindow();
return app.exec();
}

1、创建一个QLoaclSocket,连接服务器
2、创建一个QLocalServer,并监听连接
3、启动应用程序之间,检查有多少个连接,如果至少有一个,意味着打开了一个应用程序,则不再打开另一个。

二:使用QSharedMemory 
    方式:先创建一个共享内存,然后在每一个应用程序开始运行之前进行检查是否可以创建一个具有相同unique_id的共享内存,如果不能,则表示创建了实例正在运行。

[cpp] view plaincopyprint?
  1. QSharedMemory shared_memory;
  2. shared_memory.setKey(unique_id);
  3. if(shared_memory.attach())
  4. {
  5. return 0;
  6. }
  7. if(shared_memory.create(1))
  8. {
  9. MainWidget main_widget;
  10. main_widget.showNormal();
  11. main_widget.raise();
  12. main_widget.activateWindow();
  13. return app.exec();
  14. }
QSharedMemory shared_memory;
shared_memory.setKey(unique_id);
if(shared_memory.attach())
{
return 0;
}
if(shared_memory.create(1))
{
MainWidget main_widget;
main_widget.showNormal();
main_widget.raise();
main_widget.activateWindow();
return app.exec();
}

另一种方法:http://blog.csdn.net/yangxiao_0203/article/details/9622781

附:方法二main.cpp中的完整代码示例

[cpp] view plaincopyprint?
  1. //mian.cpp
  2. #include "mainwindow.h"
  3. #include <QApplication>
  4. #include <QSharedMemory>
  5. #include <QMessageBox>
  6. int main(int argc, char *argv[])
  7. {
  8. QApplication a(argc, argv);
  9. QSharedMemory shared_memory;
  10. shared_memory.setKey("THISISATEST00594869");
  11. if(shared_memory.attach())
  12. {
  13. QMessageBox::information(0,"Information","This program is running already.",QMessageBox::Yes);
  14. return 0;
  15. }
  16. if(shared_memory.create(1))
  17. {
  18. MainWindow w;
  19. w.show();
  20. return a.exec();
  21. }
  22. return -1;
  23. }
//mian.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QSharedMemory>
#include <QMessageBox>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSharedMemory shared_memory;
shared_memory.setKey("THISISATEST00594869");
if(shared_memory.attach())
{
QMessageBox::information(0,"Information","This program is running already.",QMessageBox::Yes);
return 0;
}
if(shared_memory.create(1))
{
MainWindow w;
w.show();
return a.exec();
}
return -1;
}

Qt运行一个实例进程相关推荐

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

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

  2. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码

    2019独角兽企业重金招聘Python工程师标准>>> 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错.为了更便 ...

  3. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例

    static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   ...

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

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

  5. C#程序只允许运行一个实例的解决方案

    最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分 ...

  6. 解决C#程序只允许运行一个实例的几种方法详解

    解决C#程序只允许运行一个实例的几种方法详解 参考文章: (1)解决C#程序只允许运行一个实例的几种方法详解 (2)https://www.cnblogs.com/randyzhuwei/p/5403 ...

  7. Qt应用程序只运行一个实例

    在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序.Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直 ...

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

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

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

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

最新文章

  1. Windows下如何安装MariaDB
  2. 出块过程 (1)close发送消息
  3. idm 服务器响应显示您没有权限下载此文件_仅需10分钟,让你掌握下载神器IDM的使用技巧...
  4. Thymeleaf一些标签的传字符串/message/消息
  5. 2018成都初二计算机会考时间,2018年四川学业水平考试时间及科目
  6. 2010.8.12 CString最大可以多大?
  7. Unity - Humanoid设置Bip骨骼导入报错
  8. 问题解答004:用javascript检测输入的只能是汉字,字母或者数字,并且长度为4...
  9. centos杀死进程命令
  10. Go语言实现并行分段求和计算
  11. 浅谈C#的垃圾回收-关于GC、析构函数、Dispose、and Finalize asp.net GC之析构函数详解...
  12. 手机无启动抓拍的想法
  13. javascript高级编程笔记04(基本概念)
  14. 计算机地图制图的论文,计算机地图制图实习报告.doc
  15. 谷歌f12能看到php代码吗,谷歌浏览器F12基本用法
  16. R 包 rgl 安装失败, 报错 X11 not found but required, configure aborted 及解决方法
  17. html 空格怎么打,空白空格怎么打?
  18. 王道计算机网络 第三章 数据链路层
  19. python爬取微信小程序(实战篇)_爬虫爬取微信小程序
  20. 实现微信聊天界面的泡泡对话框效果(改进)

热门文章

  1. Opne GL ES 学习心得!
  2. WebBrowser组件和MSHTML
  3. 正则表达式的比较JDK1.4 vs jakarta
  4. 夸克浏览器有没有linux,夸克浏览器怎么样?夸克浏览器使用说明
  5. linux启动spark命令,在linux上安装spark
  6. 自学python推荐书籍同时找哪些来实践-Python学习路上有这些论坛、网站、书籍与你同行...
  7. python流程控制-实战案例手把手教你Python流程控制技巧
  8. python charm下载安装教程-Python及Pycharm安装方法图文教程
  9. python画折线图详解-Python数据可视化(一) 绘制折线图和散点图
  10. python打开是什么颜色-(原)python中matplotlib的颜色及线条控制