singleapplication.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "singleapplication.h"
  2. #include <QtNetwork/QLocalSocket>
  3. const int g_TimeOut = 500; //500ms
  4. SingleApplication::SingleApplication(int &argc, char **argv)
  5. : QCoreApplication(argc, argv)
  6. , m_bIsRunning(false)
  7. , m_pLocalServer(nullptr)
  8. // , m_pWnd(nullptr)
  9. {
  10. // 取应用程序名作为LocalServer的名字
  11. m_strServerName = QCoreApplication::applicationFilePath().section('/', -1);
  12. InitLocalConnection();
  13. }
  14. //------------------------------------------------------------------------
  15. //函 数:isRunning()
  16. //
  17. //说 明:检查是否已經有一个实例在运行
  18. //
  19. //参 数:
  20. //
  21. //返 回 值: 是否有实例运行
  22. //------------------------------------------------------------------------
  23. bool SingleApplication::isRunning()
  24. {
  25. return m_bIsRunning;
  26. }
  27. //------------------------------------------------------------------------
  28. //函 数:OnNewLocalConnection()
  29. //
  30. //说 明:通过socket通讯实现程序单实例运行,监听到新的连接时触发该函数
  31. //
  32. //参 数:
  33. //
  34. //返 回 值:
  35. //------------------------------------------------------------------------
  36. void SingleApplication::OnNewLocalConnection()
  37. {
  38. qDebug()<<"OnNewLocalConnection";
  39. QLocalSocket *socket = m_pLocalServer->nextPendingConnection();
  40. if(socket)
  41. {
  42. socket->waitForReadyRead(2*g_TimeOut);
  43. delete socket;
  44. // 其他处理,如:读取启动参数
  45. // ActivateWindow();
  46. }
  47. }
  48. //------------------------------------------------------------------------
  49. //函 数:InitLocalConnection()
  50. //
  51. //说 明:初始化本地连接,如果连接不上server,则创建,否则退出
  52. //
  53. //参 数:
  54. //
  55. //返 回 值:
  56. //------------------------------------------------------------------------
  57. void SingleApplication::InitLocalConnection()
  58. {
  59. m_bIsRunning = false;
  60. QLocalSocket socket;
  61. socket.connectToServer(m_strServerName);
  62. if(socket.waitForConnected(g_TimeOut))
  63. {
  64. m_bIsRunning = true;
  65. // 其他处理,如:将启动参数发送到服务端
  66. return;
  67. }
  68. //连接不上服务器,就创建一个
  69. CreateLocalServer();
  70. }
  71. //------------------------------------------------------------------------
  72. //函 数:CreateLocalServer()
  73. //
  74. //说 明:创建LocalServer
  75. //
  76. //参 数:
  77. //
  78. //返 回 值: 是否成功
  79. //------------------------------------------------------------------------
  80. void SingleApplication::CreateLocalServer()
  81. {
  82. m_pLocalServer = new QLocalServer(this);
  83. connect(m_pLocalServer, SIGNAL(newConnection()), this, SLOT(OnNewLocalConnection()));
  84. if(!m_pLocalServer->listen(m_strServerName)) {
  85. // 此时监听失败,可能是程序崩溃时,残留进程服务导致的,移除之
  86. if(m_pLocalServer->serverError() == QAbstractSocket::AddressInUseError) {
  87. QLocalServer::removeServer(m_strServerName); // <-- 重点
  88. m_pLocalServer->listen(m_strServerName); // 再次监听
  89. }
  90. }
  91. }
  92. //------------------------------------------------------------------------
  93. //函 数:ActivateWindow()
  94. //
  95. //说 明:激活主窗口
  96. //
  97. //参 数:
  98. //
  99. //返 回 值:
  100. //------------------------------------------------------------------------
  101. // void SingleApplication::ActivateWindow()
  102. // {
  103. // if(m_pWnd)
  104. // {
  105. // //m_pWnd->show();
  106. // //m_pWnd->raise();
  107. // //m_pWnd->activateWindow(); // 激活窗口
  108. // m_pWnd->setWindowState(Qt::WindowActive);
  109. // }
  110. // }