123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- #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);
- // }
- // }
|