#include "singleapplication.h" #include 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); // } // }