Qt之运行一个实例进程
简述
发布程序的时候,我们往往会遇到这种情况:
- 只需要用户运行一个实例进程
- 用户可以同时运行多个实例进程
一个实例进程的软件有很多,例如:360、酷狗…
多个实例进程的软件也很多,例如:Visual Studio、Qt Ctretor、QQ…
下面我们来介绍下如何实现一个实例进程。
QSharedMemory
使用共享内存来实现,key值唯一,一般可以用组织名+应用名来确定。
首先,创建一个共享内存区,当第二个进程启动时,判断内存区数据是否建立,如果有,可以激活已打开的窗体,也可以退出。
当程序crash的时候,不能及时清除共享区数据,导致程序以后不能正常启动。
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QCoreApplication::setOrganizationName("Company");
QCoreApplication::setApplicationName("AppName");
QString strKey = QCoreApplication::organizationName() + QCoreApplication::applicationName();
QSharedMemory sharedMemory(strKey);
if (!sharedMemory.create(512, QSharedMemory::ReadWrite))
{
QMessageBox::information(NULL, QStringLiteral("提示"), QStringLiteral("程序已运行!"));
exit(0);
}
MainWindow window;
window.show();
return app.exec();
}
QLocalServer
QSingleApplication.h
#ifndef SINGLE_APPLICATION_H
#define SINGLE_APPLICATION_H
#include <QApplication>
class QLocalServer;
class QSingleApplication : public QApplication
{
Q_OBJECT
public:
explicit QSingleApplication(int argc, char **argv);
// 判断进程是否存在
bool isRunning();
private slots:
void newLocalConnection();
private:
QLocalServer *m_pServer;
bool m_bRunning;
};
#endif // SINGLE_APPLICATION_H
QSingleApplication.cpp
#include <QLocalSocket>
#include <QLocalServer>
#include <QFile>
#include <QTextStream>
#include "QSingleApplication.h"
QSingleApplication::QSingleApplication(int argc, char **argv)
: QApplication(argc, argv),
m_bRunning(false)
{
QCoreApplication::setOrganizationName("Company");
QCoreApplication::setApplicationName("AppName");
QString strServerName = QCoreApplication::organizationName() + QCoreApplication::applicationName();
QLocalSocket socket;
socket.connectToServer(strServerName);
if (socket.waitForConnected(500))
{
QTextStream stream(&socket);
QStringList args = QCoreApplication::arguments();
QString strArg = (args.count() > 1) ? args.last() : "";
stream << strArg;
stream.flush();
qDebug() << "Have already connected to server.";
socket.waitForBytesWritten();
m_bRunning = true;
}
else
{
// 如果不能连接到服务器,则创建一个
m_pServer = new QLocalServer(this);
connect(m_pServer, SIGNAL(newConnection()), this, SLOT(newLocalConnection()));
if (m_pServer->listen(strServerName))
{
// 防止程序崩溃,残留进程服务,直接移除
if ((m_pServer->serverError() == QAbstractSocket::AddressInUseError) && QFile::exists(m_pServer->serverName()))
{
QFile::remove(m_pServer->serverName());
m_pServer->listen(strServerName);
}
}
}
}
void QSingleApplication::newLocalConnection()
{
QLocalSocket *pSocket = m_pServer->nextPendingConnection();
if (pSocket != NULL)
{
pSocket->waitForReadyRead(1000);
QTextStream in(pSocket);
QString strValue;
in >> strValue;
qDebug() << QString("The value is: %1").arg(strValue);
delete pSocket;
pSocket = NULL;
}
}
bool QSingleApplication::isRunning()
{
return m_bRunning;
}
使用方式
int main(int argc, char **argv)
{
QSingleApplication app(argc,argv);
if (app.isRunning())
{
QMessageBox::information(NULL, QStringLiteral("提示"), QStringLiteral("程序已运行!"));
exit(0);
}
MainWindow window;
window.show();
return app.exec();
}
QtSingleApplication
QSingleApplication位于qt-solution里面,并不包含在Qt库中,遵循 LGPL 协议。
文档、源码、示例见:QtSingleApplication
任务列表
运行程序时,遍历任务列表,查看是当前所有运行中的进程,如果当前进程位置在映射路径中可以找到,则说明程序已经运行,否则,未运行。
更多参考
Qt之运行一个实例进程的更多相关文章
- 如何用Qt写一个同一时间只能运行一个实例的应用程序
http://blog.sina.com.cn/s/blog_6343941a0100nk2x.html 可以达到的目的: 1.应用只启动一个实例,依赖于QtNetwork模块 2.启动时向另一个实例 ...
- Linux编程之《只运行一个实例》
概述 有些时候,我们要求一个程序在系统中只能启动一个实例.比如,Windows自带的播放软件Windows Medea Player在Windows里就只能启动一个实例.原因很简单,如果同时启动几个实 ...
- 解决C#程序只允许运行一个实例的几种方法详解
解决C#程序只允许运行一个实例的几种方法详解 本篇文章是对C#中程序只允许运行一个实例的几种方法进行了详细的分析介绍,需要的朋友参考下 本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运 ...
- C#让应用程序只运行一个实例的几种方法
一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>pu ...
- C# WINFORM判断程序是否运行,且只能运行一个实例(转)
判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种, 方法1:线程互斥 static class Program { private static System.Threading. ...
- WinForm判断程序是否已经在运行,且只允许运行一个实例
我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错. 为了更便于使用,笔者整理了一段自己用的代码,可以判断程序是否在运行,只运行一个实 ...
- VC 实现程序只运行一个实例,并激活已运行的程序
转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...
- winform判断程序是否运行,且只能运行一个实例
前言 判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种. 目前使用的是第一种方法. 方法1:线程互斥 static class Program { private static S ...
- C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper
前言 在开发应用程序时,通常只让程序运行一个实例.所以,就要判断程序是否已经运行. 下面是我自己在项目中使用到,封装好的帮助类.有 普通的 C# 应用程序 和 Windows CE 和 Windows ...
随机推荐
- 【转】使用JIRA搭建企业问题跟踪系统【个人推荐】
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:Judy Shen的专栏 原文地址:使用JIRA搭建企业问题跟踪系统 ...
- 【树形DP/搜索】BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会
1827: [Usaco2010 Mar]gather 奶牛大集会 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 793 Solved: 354[Sub ...
- 无废话网页重构系列——(7)布局(区块、栅格)、模块组件(module)
本文作者:大象本文地址:http://www.cnblogs.com/daxiang/p/4654800.html 在构建HTML主干结构后,开始编写“页面布局”和“模块组件”: 页面框架由几个主干结 ...
- d3d11 effect state and default value tables
Blend state State Default ValueAlphaToCoverage Enable FALSEIndependentBlend Enable FALSERenderTarget ...
- [原] GLES在iOS和Android上的不同
本来GLES提供了与native platform的接口 EGL, 然而iOS没有使用EGL接口, 而是自己搞了一套,叫做EAGL的类似东西, 虽然说大同小异,但是在做跨平台的时候还是很恶心. elg ...
- 牛顿迭代法实现平方根函数sqrt
转自利用牛顿迭代法自己写平方根函数sqrt 给定一个正数a,不用库函数求其平方根. 设其平方根为x,则有x2=a,即x2-a=0.设函数f(x)= x2-a,则可得图示红色的函数曲线.在曲线上任取一点 ...
- Even Fibonacci numbers
--Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting ...
- Const和ReadOnly区别及其用途--转载
常量的概念就是一个包含不能修改的值的变量,常量是C#与大多数编程语言共有的.但是,常量不必满足所有的要求.有时可能需要一些变量,其值不应改变,但在运行之前其值是未知的.C#为这种情形提供了另一个类型的 ...
- hdu 1329 Hanoi Tower Troubles Again!
找规律的题目an=an-1+(i+i%2)/2*2; ;}
- Shell最多支持多少个参数
本文转自:http://www.jb51.net/article/56548.htm 这篇文章主要介绍了Shell最多支持多少个参数?本文是对Shell最多可以输入多少个参数的一篇测试文章,需要的 ...