Ver código fonte

V1.4.4
1、修改了MQTT的日志输出,添加了MQTT前缀
2、新增了检查单个进程的功能类

Apple 1 semana atrás
pai
commit
d07179a086

+ 3 - 3
Libraries/qmqtt/mqttBase/MQTTBase.cpp

@@ -135,19 +135,19 @@ void MQTTBase::do_connected()
 /* 断开连接 */
 void MQTTBase::do_disconnect()
 {
-    SPDLOG_INFO("断开连接!");
+    SPDLOG_INFO("MQTT 断开连接!");
 }
 
 /* 错误 */
 void MQTTBase::do_error(const QMQTT::ClientError error)
 {
-    SPDLOG_ERROR("错误:{}", (int)error);
+    SPDLOG_ERROR("MQTT 错误:{}", (int)error);
 }
 
 /* 订阅成功 */
 void MQTTBase::do_subscribed(const QString& topic, const quint8 qos)
 {
-    SPDLOG_INFO("订阅:{}, QoS:{} 成功", topic.toStdString(), qos);
+    SPDLOG_INFO("MQTT 订阅:{}, QoS:{} 成功", topic.toStdString(), qos);
 }
 
 /* 接收到消息 */

+ 115 - 0
common/SingleApplication/singleapplication.cpp

@@ -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);
+//     }
+// }

+ 29 - 0
common/SingleApplication/singleapplication.h

@@ -0,0 +1,29 @@
+#ifndef SINGLEAPPLICATION_H
+#define SINGLEAPPLICATION_H
+
+#include <QObject>
+#include <QCoreApplication>
+#include <QtNetwork/QLocalServer>
+// #include <QWidget>
+
+class SingleApplication : public QCoreApplication 
+{
+    Q_OBJECT
+public:
+    SingleApplication(int &argc, char **argv);
+    bool isRunning();
+    // void SetWnd(QWidget *wnd){m_pWnd = wnd;}
+private slots:
+    void OnNewLocalConnection();
+private:
+    void InitLocalConnection();
+    void CreateLocalServer();
+    // void ActivateWindow();
+    
+    bool m_bIsRunning;                      //是否已經有实例在运行
+    QLocalServer *m_pLocalServer;           //本地socket Server
+    QString m_strServerName;                //服务名称
+    // QWidget *m_pWnd;                        //MainWindow指针
+};
+
+#endif // SINGLEAPPLICATION_H