Browse Source

V0.10
1、修改了线程池添加线程的逻辑

Apple 2 tuần trước cách đây
mục cha
commit
fe6dd8a6f8

+ 19 - 8
Libraries/LHHTTPAPI/FindLHHTTPAPI.cmake

@@ -12,16 +12,27 @@ find_path(INCLUDE_DIR
 )
 
 list(APPEND LHHTTPAPI_INCLUDE_DIRS ${INCLUDE_DIR})
+list(APPEND LHHTTPAPI_SOURCE_DIRS ${INCLUDE_DIR})
 
-#查找源文件
-unset(SOURCE_DIR CACHE)
-find_path(SOURCE_DIR 
-    NAMES lhhttpapi.cpp
-    PATHS ${CMAKE_CURRENT_LIST_DIR}/src
-    NO_DEFAULT_PATH
-)
 
-list(APPEND LHHTTPAPI_SOURCE_DIRS ${SOURCE_DIR})
+#查找源文件
+# unset(SOURCE_DIR CACHE)
+# find_path(SOURCE_DIR 
+#     NAMES lhhttpapi.cpp
+#     PATHS ${CMAKE_CURRENT_LIST_DIR}/src
+#     NO_DEFAULT_PATH
+# )
+
+# list(APPEND LHHTTPAPI_SOURCE_DIRS ${SOURCE_DIR})
+
+# unset(SOURCE_DIR CACHE)
+# find_path(SOURCE_DIR 
+#     NAMES threadcontroller.cpp
+#     PATHS ${CMAKE_CURRENT_LIST_DIR}/../../common/Thread
+#     NO_DEFAULT_PATH
+# )
+
+# list(APPEND LHHTTPAPI_SOURCE_DIRS ${SOURCE_DIR})
 
 # 查找库文件,在这里区分平台,Debug和Release,32位和64位
 # 这里没有使用这个文件夹内的curl库,而是使用了外部的curl库

+ 96 - 0
common/communication/WebAPIBase.cpp

@@ -0,0 +1,96 @@
+#include "WebAPIBase.h"
+
+#include "lhhttpapi.h"
+
+WebAPIBase::WebAPIBase()
+{
+    m_logger = spdlog::get("FromWebAPI");
+    if(m_logger == nullptr)
+    {
+        fmt::print("FromWebAPI logger is nullptr");
+        return;
+    }
+}
+
+WebAPIBase::~WebAPIBase()
+{
+    if(m_httpApi != nullptr)
+    {
+        delete m_httpApi;
+        m_httpApi = nullptr;
+    }
+    
+}
+
+/* 初始化WebAPI */
+bool WebAPIBase::initWebApi(const QString& url, const QString& serID, const QString appType, const QString serverIP)
+{
+    if(m_httpApi == nullptr)
+    {
+        m_httpApi = new lhhttpapi;
+    }
+    
+    if(!m_httpApi->Load())
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "Load WebAPI failed");
+        return false;
+    }
+    SPDLOG_LOGGER_DEBUG(m_logger, "URL: {}", url.toStdString());
+    SPDLOG_LOGGER_DEBUG(m_logger, "ServerID: {}", serID.toStdString());
+    SPDLOG_LOGGER_DEBUG(m_logger, "ServerKey: {}", appType.toStdString());
+
+    void* pHttp = nullptr;
+    int i = 0;
+    for(i = 0; i < 3; i++)
+    {
+        pHttp = m_httpApi->DBInit(url.toStdString().c_str(), true);
+        if(pHttp != nullptr)
+        {
+            break;
+        }
+        SPDLOG_LOGGER_ERROR(m_logger, "设置WebAPI地址失败: {}", m_httpApi->DoGetLastError(&i).toStdString());
+    }
+    if(i >= 3)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "WebAPI设置地址错误!");
+        return false;
+    }
+    
+    int ret = 0;
+
+#ifdef QT_DEBUG
+    /* 获取服务器列表 */
+    // char serverList[8192]={0};
+    // ret = m_httpApi->DBGetServerList(serverList, 8192-1);
+    // if(ret != 0)
+    // {
+    //     SPDLOG_LOGGER_ERROR(m_logger, "Get server list failed: {}, error info: {}", ret, m_httpApi->DoGetLastError(&ret).toStdString());
+    //     return false;
+    // }
+    // SPDLOG_LOGGER_INFO(m_logger, QString("\nGet server list success:%1").arg(serverList));
+#endif
+
+    /* 登录,第二个参数是限制的服务 */
+    for(i = 0; i < 3; i++)
+    {
+        ret = m_httpApi->DBLogin("", serID, appType, m_userToken, true, pHttp);
+        if(ret == 0)
+        {
+            break;
+        }
+        SPDLOG_LOGGER_ERROR(m_logger, "Login failed: {}, error info: {}", ret, m_httpApi->DoGetLastError(&ret).toStdString());
+        /* 登录失败,等待一段时间 */
+        QThread::msleep(200);
+    }
+    if(i >= 3)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "登陆WebAPI失败!");
+        return false;
+    }
+
+    SPDLOG_LOGGER_INFO(m_logger, "WebAPI Login success!");
+
+    return true;
+}
+
+

+ 30 - 0
common/communication/WebAPIBase.h

@@ -0,0 +1,30 @@
+#ifndef WEBAPIBASE_H
+#define WEBAPIBASE_H
+
+#include <QString>
+
+#include "spdlog/spdlog.h"
+
+class lhhttpapi;
+
+class WebAPIBase
+{
+public:
+    
+    WebAPIBase();
+    virtual ~WebAPIBase();
+
+    /* 初始化WebAPI */
+    bool initWebApi(const QString& url, const QString& serID, const QString appType, const QString serverIP = "");
+
+private:
+    std::shared_ptr<spdlog::logger> m_logger = nullptr;
+
+    lhhttpapi* m_httpApi = nullptr;
+    QString m_userToken;
+};
+
+
+
+
+#endif /* WEBAPIBASE_H */

+ 44 - 22
module/ThreadPool/ThreadPool.cpp

@@ -136,30 +136,42 @@ void ThreadPool::managerThread()
             int numTask = (int)m_queue_Tasks.size();            /* 获取任务队列中的任务个数 */
             lock.unlock();
             int numAdd = 0;
-            if(numTask > 0)
+            /* 重新修改增加数目,正常情况下增加 numTask + m_threadMiniIdle - num_idle 数目,达到最低空闲线程个数,
+               如果二者之和超过了最大线程数,就添加可以添加的最多数目 */
+            // if(numTask > 0)
+            // {
+                // /* 任务数 + 存在的线程个数是否大于最大线程数 */
+                // if( numTask + m_threadLiveNum.load() <= m_threadMaxNum )
+                // {
+                //     /* 创建numTask个线程 */
+                //     numAdd = numTask;
+                // }
+                // /* 默认添加的个数 + 存在的线程数是否大于最大线程数 */
+                // else if ( (m_threadAddNum.load() + m_threadLiveNum.load()) <= m_threadMaxNum)
+                // {
+                //     /* 创建m_threadAddNum个线程 */
+                //     numAdd = m_threadAddNum.load();
+                // }
+                // /* 能添加几个线程就添加几个线程 */
+                // else
+                // {
+                //     numAdd = m_threadMaxNum - m_threadLiveNum.load();
+                // }
+
+            // } else
+            // {
+            //     /* 没有新任务,但是空闲线程数低于设置的最小空闲线程数 */
+            //     numAdd = m_threadMiniIdle.load() - num_idle;
+            // }
+            numAdd = numTask + m_threadMiniIdle.load() - num_idle;
+            if(numAdd < 0)
             {
-                /* 任务数 + 存在的线程个数是否大于最大线程数 */
-                if( numTask + m_threadLiveNum.load() <= m_threadMaxNum )
-                {
-                    /* 创建numTask个线程 */
-                    numAdd = numTask;
-                }
-                /* 默认添加的个数 + 存在的线程数是否大于最大线程数 */
-                else if ( (m_threadAddNum.load() + m_threadLiveNum.load()) <= m_threadMaxNum)
-                {
-                    /* 创建m_threadAddNum个线程 */
-                    numAdd = m_threadAddNum.load();
-                }
-                /* 能添加几个线程就添加几个线程 */
-                else
-                {
-                    numAdd = m_threadMaxNum - m_threadLiveNum.load();
-                }
+                numAdd = 0;   /* 如果计算出来的添加数目小于0,就不添加 */
             }
-            /* 空闲线程数低于设置的最小空闲线程数 */
-            else
+            /* 如果添加的线程数目超过了最大线程数,就添加可以添加的最多数目 */
+            if (numAdd + m_threadLiveNum.load() > m_threadMaxNum)
             {
-                numAdd = m_threadMiniIdle.load() - num_idle;
+                numAdd = m_threadMaxNum - m_threadLiveNum.load();
             }
             
             if(numAdd > 0)
@@ -171,6 +183,11 @@ void ThreadPool::managerThread()
             
         }
 
+        if(m_threadLiveNum .load() >= m_threadMaxNum)
+        {
+            LOG_DEBUG("线程池中现存的线程个数: " << m_threadLiveNum.load() << ",超过最大线程数: " << m_threadMaxNum);
+        }
+
         /* 判断空闲线程是否过多,是否需要销毁几个线程 */
         // LOG_DEBUG("***** 判断是否需要销毁线程 *****");
         /* 由于没规定每次销毁的线程个数,所以这里使用m_threadAddNum作为每次销毁的标准个数 */
@@ -183,7 +200,7 @@ void ThreadPool::managerThread()
             }
             m_threadExitNum.exchange(num_Exit);
 
-            LOG_INFO("有" << m_threadExitNum.load() << "个线程需要退出");
+            LOG_DEBUG("有" << m_threadExitNum.load() << "个线程需要退出");
             /* 唤醒需要退出的num_idle个线程 */
             for (int i = 0; i < num_Exit; i++)
             {
@@ -207,6 +224,11 @@ void ThreadPool::managerThread()
  */
 void ThreadPool::createThread(int num)
 {
+    if(num <=0 )
+    {
+        LOG_WARN("创建线程的个数不能小于等于0");
+        return;
+    }
     for (int i = 0; i < num; i++)
     {
         /* 创建线程,传入工作函数 */