|
@@ -0,0 +1,115 @@
|
|
|
|
+#include "singleapplication.h"
|
|
|
|
+#include <QtNetwork/QLocalSocket>
|
|
|
|
+
|
|
|
|
+const int g_TimeOut = 500; //500ms
|
|
|
|
+
|
|
|
|
+SingleApplication::SingleApplication(int &argc, char **argv)
|
|
|
|
+ : QCoreApplication(argc, argv)
|
|
|
|
+ , m_bIsRunning(false)
|
|
|
|
+ , m_pLocalServer(nullptr)
|
|
|
|
+ // , m_pWnd(nullptr)
|
|
|
|
+{
|
|
|
|
+ // 取应用程序名作为LocalServer的名字
|
|
|
|
+ m_strServerName = QCoreApplication::applicationFilePath().section('/', -1);
|
|
|
|
+ InitLocalConnection();
|
|
|
|
+}
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
|
+//函 数:isRunning()
|
|
|
|
+//
|
|
|
|
+//说 明:检查是否已經有一个实例在运行
|
|
|
|
+//
|
|
|
|
+//参 数:
|
|
|
|
+//
|
|
|
|
+//返 回 值: 是否有实例运行
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
|
+bool SingleApplication::isRunning()
|
|
|
|
+{
|
|
|
|
+ return m_bIsRunning;
|
|
|
|
+}
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
|
+//函 数:OnNewLocalConnection()
|
|
|
|
+//
|
|
|
|
+//说 明:通过socket通讯实现程序单实例运行,监听到新的连接时触发该函数
|
|
|
|
+//
|
|
|
|
+//参 数:
|
|
|
|
+//
|
|
|
|
+//返 回 值:
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
|
+void SingleApplication::OnNewLocalConnection()
|
|
|
|
+{
|
|
|
|
+ qDebug()<<"OnNewLocalConnection";
|
|
|
|
+ QLocalSocket *socket = m_pLocalServer->nextPendingConnection();
|
|
|
|
+ if(socket)
|
|
|
|
+ {
|
|
|
|
+ socket->waitForReadyRead(2*g_TimeOut);
|
|
|
|
+ delete socket;
|
|
|
|
+ // 其他处理,如:读取启动参数
|
|
|
|
+ // ActivateWindow();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
|
+//函 数:InitLocalConnection()
|
|
|
|
+//
|
|
|
|
+//说 明:初始化本地连接,如果连接不上server,则创建,否则退出
|
|
|
|
+//
|
|
|
|
+//参 数:
|
|
|
|
+//
|
|
|
|
+//返 回 值:
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
|
+void SingleApplication::InitLocalConnection()
|
|
|
|
+{
|
|
|
|
+ m_bIsRunning = false;
|
|
|
|
+
|
|
|
|
+ QLocalSocket socket;
|
|
|
|
+ socket.connectToServer(m_strServerName);
|
|
|
|
+ if(socket.waitForConnected(g_TimeOut))
|
|
|
|
+ {
|
|
|
|
+ m_bIsRunning = true;
|
|
|
|
+ // 其他处理,如:将启动参数发送到服务端
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //连接不上服务器,就创建一个
|
|
|
|
+ CreateLocalServer();
|
|
|
|
+}
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
|
+//函 数:CreateLocalServer()
|
|
|
|
+//
|
|
|
|
+//说 明:创建LocalServer
|
|
|
|
+//
|
|
|
|
+//参 数:
|
|
|
|
+//
|
|
|
|
+//返 回 值: 是否成功
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
|
+void SingleApplication::CreateLocalServer()
|
|
|
|
+{
|
|
|
|
+ m_pLocalServer = new QLocalServer(this);
|
|
|
|
+ connect(m_pLocalServer, SIGNAL(newConnection()), this, SLOT(OnNewLocalConnection()));
|
|
|
|
+ if(!m_pLocalServer->listen(m_strServerName)) {
|
|
|
|
+ // 此时监听失败,可能是程序崩溃时,残留进程服务导致的,移除之
|
|
|
|
+ if(m_pLocalServer->serverError() == QAbstractSocket::AddressInUseError) {
|
|
|
|
+ QLocalServer::removeServer(m_strServerName); // <-- 重点
|
|
|
|
+ m_pLocalServer->listen(m_strServerName); // 再次监听
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
|
+//函 数:ActivateWindow()
|
|
|
|
+//
|
|
|
|
+//说 明:激活主窗口
|
|
|
|
+//
|
|
|
|
+//参 数:
|
|
|
|
+//
|
|
|
|
+//返 回 值:
|
|
|
|
+//------------------------------------------------------------------------
|
|
|
|
+// void SingleApplication::ActivateWindow()
|
|
|
|
+// {
|
|
|
|
+// if(m_pWnd)
|
|
|
|
+// {
|
|
|
|
+// //m_pWnd->show();
|
|
|
|
+// //m_pWnd->raise();
|
|
|
|
+// //m_pWnd->activateWindow(); // 激活窗口
|
|
|
|
+// m_pWnd->setWindowState(Qt::WindowActive);
|
|
|
|
+// }
|
|
|
|
+// }
|