|
@@ -8,6 +8,9 @@
|
|
|
#include "UniversalFunc.h"
|
|
|
#include "FuncOrdinary.h"
|
|
|
#include "FuncIllegalInvasion.h"
|
|
|
+#include "FuncOnAndOffJob.h"
|
|
|
+#include "FuncRegionalPerson.h"
|
|
|
+
|
|
|
#include "GlobalFuncThread.h"
|
|
|
|
|
|
#include <QCoreApplication>
|
|
@@ -21,22 +24,13 @@ SPAServer::SPAServer()
|
|
|
SPDLOG_ERROR("APAServer logger is nullptr");
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- /* 读取全局的配置文件 */
|
|
|
- QString strConfigFile = QCoreApplication::applicationDirPath() + "/config.ini";
|
|
|
- if(!GConfig.readConfig(strConfigFile))
|
|
|
- {
|
|
|
- /* 读取配置文件失败,直接退出程序 */
|
|
|
- return;
|
|
|
- }
|
|
|
- GConfig.printValue();
|
|
|
|
|
|
|
|
|
m_threadRunning = true;
|
|
|
/* 初始化WebAPI */
|
|
|
- m_fromWebAPI.initWebApi("http://192.1.3.133:31000/v6/", "", "4c2f9fc91c22dd98331e47af2e2964f4");
|
|
|
+ // m_fromWebAPI.initWebApi("http://192.1.3.133:31000/v6/", "", "4c2f9fc91c22dd98331e47af2e2964f4");
|
|
|
/* 模拟违禁品算法ID,后续需要动态调整 */
|
|
|
- g_actionList.ActContraband = "OD210_026_005246_001-IZRTKyEx";
|
|
|
+ // GVariable.ActContraband = "OD210_026_005246_001-IZRTKyEx";
|
|
|
|
|
|
}
|
|
|
|
|
@@ -49,16 +43,22 @@ SPAServer::~SPAServer()
|
|
|
void SPAServer::startServer()
|
|
|
{
|
|
|
/* 添加获取基础信息的线程 */
|
|
|
- // CPPTP.add_task(&SPAServer::threadFromSuperBrain, this);
|
|
|
+ CPPTP.add_task(&SPAServer::threadFromSuperBrain, this);
|
|
|
+ // threadFromSuperBrain();
|
|
|
+
|
|
|
+ /* 延时启动任务分配线程 */
|
|
|
+ std::this_thread::sleep_for(std::chrono::seconds(2));
|
|
|
+ /* 添加分配任务的线程 */
|
|
|
+ CPPTP.add_task(&SPAServer::threadDistribution, this);
|
|
|
|
|
|
/* 测试Redis读取并解析数据线程 */
|
|
|
- CameraThreadInfo info;
|
|
|
- info.RedisIP = "172.16.36.80";
|
|
|
- info.RedisPort = 32222;
|
|
|
- info.RedisPWD = "Ff1z@TOFr^iwd%Ra";
|
|
|
- info.DeviceID = 117;
|
|
|
- info.vecAction.push_back("OD210_026_005246_001-IZRTKyEx");
|
|
|
- g_actionList.ActContraband = "OD210_026_005246_001-IZRTKyEx";
|
|
|
+ // CameraThreadInfo info;
|
|
|
+ // info.RedisIP = "172.16.36.80";
|
|
|
+ // info.RedisPort = 32222;
|
|
|
+ // info.RedisPWD = "Ff1z@TOFr^iwd%Ra";
|
|
|
+ // info.DeviceID = 117;
|
|
|
+ // info.vecAction.push_back("OD210_026_005246_001-IZRTKyEx");
|
|
|
+ // GVariable.ActContraband = "OD210_026_005246_001-IZRTKyEx";
|
|
|
// CPPTP.add_task(&SPAServer::threadFromRedis, this, info);
|
|
|
// threadFromRedis(info);
|
|
|
}
|
|
@@ -76,39 +76,84 @@ void SPAServer::threadFromSuperBrain()
|
|
|
std::vector<AlgorithmInfo> vecAlgNewInfo;
|
|
|
std::vector<DeviceInfo> vecDevNewInfo;
|
|
|
|
|
|
- /* 获取一次token,后续失效了再获取 */
|
|
|
- m_fromSuperBrain.getToken();
|
|
|
+ /* 初始化WebAPI */
|
|
|
+ if(!m_fromWebAPIUseSB.initWebApi(GConfig.webapiUrl(), GConfig.webapiKey(), GConfig.webapiAppType()))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "threadFromSuperBrain线程初始化WebAPI失败");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 初始化SuperBrain */
|
|
|
+ m_fromSuperBrain.initSuperBrain(GConfig.superBrainUrl(), GConfig.superBrainAppKey(), GConfig.superBrainAppSecret());
|
|
|
+ /* 获取一次Token,这玩意好像不是必须的 */
|
|
|
+ if(!m_fromSuperBrain.getToken())
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "FromSuperBrain线程获取Token失败");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
while (m_threadRunning)
|
|
|
{
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "刷新算法和设备信息");
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "----------------- 刷新算法和设备信息 -----------------");
|
|
|
/* 先更新数据库的信息,防止从其他地方更改了数据库,这里没有刷新本地缓存 */
|
|
|
- m_fromWebAPI.getAlgorithmInfo(m_vecEqmAlgInfo);
|
|
|
- m_fromWebAPI.getDeviceInfo(m_vecEqmDevInfo);
|
|
|
- m_fromWebAPI.getDeviceAlgorithmInfo(m_vecEqmDevInfo, m_listDevIDDelete);
|
|
|
+ m_fromWebAPIUseSB.getAlgorithmInfo(m_vecEqmAlgInfo);
|
|
|
+ m_fromWebAPIUseSB.getDeviceInfo(m_vecEqmDevInfo);
|
|
|
+ m_fromWebAPIUseSB.getDeviceAlgorithmInfo(m_vecEqmDevInfo, m_listDevIDDelete);
|
|
|
|
|
|
/* 从超脑获取基础信息 */
|
|
|
- m_fromSuperBrain.getTaskTypeList(vecAlgNewInfo);
|
|
|
+ // m_fromSuperBrain.getTaskTypeList(vecAlgNewInfo);
|
|
|
m_fromSuperBrain.getDeviceList(vecDevNewInfo);
|
|
|
+ // SPDLOG_LOGGER_INFO(m_logger, "获取到的设备信息数量: {}", vecDevNewInfo.size());
|
|
|
|
|
|
- /* 处理算法信息 */
|
|
|
- bool algIsUpdate = processAlgorithmInfo(vecAlgNewInfo);
|
|
|
+ /* 将设备返回的算法ID替换成带有后缀的全ID */
|
|
|
+ checkAlgorithmID(vecDevNewInfo);
|
|
|
+ /* 处理算法信息,算法信息不需要在服务里处理了,在外部手动处理 */
|
|
|
+ // bool algIsUpdate = processAlgorithmInfo(vecAlgNewInfo);
|
|
|
/* 处理设备信息 */
|
|
|
bool devIsUpdate = processDeviceInfo(vecDevNewInfo);
|
|
|
+ if(!devIsUpdate)
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "设备信息和算法信息没有更新");
|
|
|
+ }
|
|
|
|
|
|
vecAlgNewInfo.clear();
|
|
|
vecDevNewInfo.clear();
|
|
|
|
|
|
/* 更新算法详细信息 */
|
|
|
m_mutexActionInfo.lock();
|
|
|
- m_fromWebAPI.getActionInfo(m_listActionInfo);
|
|
|
+ m_fromWebAPIUseSB.getActionInfo(m_listActionInfo);
|
|
|
m_mutexActionInfo.unlock();
|
|
|
|
|
|
- /* 10秒更新一次 */
|
|
|
- std::this_thread::sleep_for(std::chrono::seconds(10));
|
|
|
+ /* 20秒更新一次 */
|
|
|
+ std::this_thread::sleep_for(std::chrono::seconds(GVariable.CheckDeviceTime));
|
|
|
}
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "退出 fromSuperBrainThread 线程");
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/* 替换算法ID为全ID */
|
|
|
+void SPAServer::checkAlgorithmID(std::vector<DeviceInfo>& vecDevInfo)
|
|
|
+{
|
|
|
+ /* 替换算法ID为全ID */
|
|
|
+ for(auto& dev : vecDevInfo)
|
|
|
+ {
|
|
|
+ for(auto act = dev.vecAlgorithmInfo.begin(); act != dev.vecAlgorithmInfo.end(); act++)
|
|
|
+ {
|
|
|
+ /* 替换算法ID为全ID */
|
|
|
+ std::string strFullID = GVariable.getFullActionID(act->ActionID);
|
|
|
+ if(strFullID.empty())
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "未知的算法ID: {}", act->ActionID);
|
|
|
+ /* 删除算法ID */
|
|
|
+ // act = dev.vecAlgorithmInfo.erase(act);
|
|
|
+ }else {
|
|
|
+ /* 替换算法ID */
|
|
|
+ act->ActionID = strFullID;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/* 处理算法信息,返回值为true,说明有改变,需要重新读取 */
|
|
|
bool SPAServer::processAlgorithmInfo(std::vector<AlgorithmInfo> vecNewAlgInfo)
|
|
|
{
|
|
@@ -117,19 +162,19 @@ bool SPAServer::processAlgorithmInfo(std::vector<AlgorithmInfo> vecNewAlgInfo)
|
|
|
|
|
|
/* 对比数据库表格信息,这里只有插入和删除,没有更新 */
|
|
|
compareAlgorithmInfo(vecNewAlgInfo, vecAlgUpdate, vecAlgDelete);
|
|
|
-
|
|
|
+
|
|
|
/* 更新数据库,先删除,再写入刷新 */
|
|
|
bool isUpdate = false;
|
|
|
if(vecAlgDelete.size() > 0)
|
|
|
{
|
|
|
SPDLOG_LOGGER_DEBUG(m_logger, "删除算法信息");
|
|
|
- m_fromWebAPI.deleteAlgorithmInfo(vecAlgDelete);
|
|
|
+ m_fromWebAPIUseSB.deleteAlgorithmInfo(vecAlgDelete);
|
|
|
isUpdate = true;
|
|
|
}
|
|
|
if(vecAlgUpdate.size() > 0)
|
|
|
{
|
|
|
SPDLOG_LOGGER_DEBUG(m_logger, "写入算法信息");
|
|
|
- m_fromWebAPI.writeAlgorithmInfo(vecAlgUpdate);
|
|
|
+ m_fromWebAPIUseSB.writeAlgorithmInfo(vecAlgUpdate);
|
|
|
isUpdate = true;
|
|
|
}
|
|
|
|
|
@@ -212,53 +257,74 @@ bool SPAServer::processDeviceInfo(std::vector<DeviceInfo> vecNewDevInfo)
|
|
|
/* 先删除多余的数据 */
|
|
|
if(vecDevDelete.size() > 0)
|
|
|
{
|
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "删除设备信息, 表: tActionCamer");
|
|
|
- m_fromWebAPI.deleteDeviceInfo(vecDevDelete);
|
|
|
- isUpdate = true;
|
|
|
+ if(m_fromWebAPIUseSB.deleteDeviceInfo(vecDevDelete))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger,"删除设备信息到 tCamerInfo, 数量:{}",vecDevDelete.size());
|
|
|
+ isUpdate = true;
|
|
|
+ }
|
|
|
}
|
|
|
/* 更新数据 */
|
|
|
if(vecDevUpdate.size() > 0)
|
|
|
{
|
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "更新设备信息, 表: tActionCamer");
|
|
|
- m_fromWebAPI.updateDeviceInfo(vecDevUpdate);
|
|
|
- isUpdate = true;
|
|
|
+ if(m_fromWebAPIUseSB.updateDeviceInfo(vecDevUpdate))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger, "更新设备信息到 tCamerInfo, 数量:{}", vecDevUpdate.size());
|
|
|
+ isUpdate = true;
|
|
|
+ }
|
|
|
}
|
|
|
/* 插入数据 */
|
|
|
if(vecDevInsert.size() > 0)
|
|
|
{
|
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "插入设备信息, 表: tActionCamer");
|
|
|
- m_fromWebAPI.insertDeviceInfo(vecDevInsert);
|
|
|
- isUpdate = true;
|
|
|
+ if(m_fromWebAPIUseSB.insertDeviceInfo(vecDevInsert))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger, "插入设备信息到 tCamerInfo, 数量:{}", vecDevInsert.size());
|
|
|
+ isUpdate = true;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ // for(auto& it : vecNewDevInfo)
|
|
|
+ // {
|
|
|
+ // for(auto& it0 : it.vecAlgorithmInfo)
|
|
|
+ // {
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "设备ID: {}, 算法ID: {}", it.DeviceID, it0.ActionID);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+
|
|
|
/*-------------------------------------------------------------------------
|
|
|
************* 处理设备和算子关联的表格,单独对比设备的算法信息 *************
|
|
|
*------------------------------------------------------------------------*/
|
|
|
|
|
|
/* 插入新的设备信息 */
|
|
|
- if(vecDevInsert.size() > 0)
|
|
|
- {
|
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "插入设备和算法关联表(tActionCamer)");
|
|
|
- m_fromWebAPI.insertDeviceAlgorithmInfo(vecDevInsert);
|
|
|
- isUpdate = true;
|
|
|
- }
|
|
|
+ // if(vecDevInsert.size() > 0)
|
|
|
+ // {
|
|
|
+ // if(m_fromWebAPIUseSB.insertDeviceAlgorithmInfo(vecDevInsert))
|
|
|
+ // {
|
|
|
+ // SPDLOG_LOGGER_DEBUG(m_logger, "插入设备和算法关联表(tActionCamer), 数量: {}", vecDevInsert.size());
|
|
|
+ // isUpdate = true;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
|
|
|
vecDevUpdate.clear();
|
|
|
/* 对比现有的设备是否需要更新算法 */
|
|
|
compareDeviceAlgorithmInfo(vecNewDevInfo, vecDevUpdate);
|
|
|
if(vecDevUpdate.size() > 0)
|
|
|
{
|
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "更新设备和算法关联表(tActionCamer), 更新设备数目:{}", vecDevUpdate.size());
|
|
|
- m_fromWebAPI.updateDeviceAlgorithmInfo(vecDevUpdate);
|
|
|
+ if(m_fromWebAPIUseSB.updateDeviceAlgorithmInfo(vecDevUpdate))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger, "更新设备和算法关联表(tActionCamer), 更新设备数目:{}", vecDevUpdate.size());
|
|
|
+ isUpdate = true;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
/* 删除tActionCamer表中消失的设备信息 */
|
|
|
if(m_listDevIDDelete.size() > 0)
|
|
|
{
|
|
|
- SPDLOG_LOGGER_DEBUG(m_logger, "删除消失的设备关联的算法(tActionCamer)");
|
|
|
- m_fromWebAPI.deleteDeviceAlgorithmInfo(m_listDevIDDelete);
|
|
|
- isUpdate = true;
|
|
|
+ if(m_fromWebAPIUseSB.deleteDeviceAlgorithmInfo(m_listDevIDDelete))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger, "删除消失的设备关联的算法(tActionCamer), 数目: {}", m_listDevIDDelete.size());
|
|
|
+ isUpdate = true;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -377,70 +443,6 @@ void SPAServer::compareDeviceAlgorithmInfo(const std::vector<DeviceInfo>& vecNew
|
|
|
|
|
|
|
|
|
|
|
|
-/**
|
|
|
- * @brief 从Redis获取数据线程函数,这个是摄像机线程
|
|
|
- * 一个设备一个线程,这个线程的相关变量只在这个线程中使用
|
|
|
- * (注意,这个函数未被使用,不从这里获取Redis数据)
|
|
|
- * @param info
|
|
|
- */
|
|
|
-void SPAServer::threadFromRedis(const CameraThreadInfo& info)
|
|
|
-{
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "开启 fromRedisThread 线程,设备ID:{}", info.DeviceID);
|
|
|
- FromRedis fromRedis;
|
|
|
- fromRedis.setRedisIPAndPort(info.RedisIP, info.RedisPort);
|
|
|
- fromRedis.setRedisPassword(info.RedisPWD);
|
|
|
- if(fromRedis.connectRedis())
|
|
|
- {
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "连接Redis成功");
|
|
|
- }else {
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "连接Redis失败");
|
|
|
- return;
|
|
|
- }
|
|
|
- CameraThreadInfo threadInfo = info;
|
|
|
- // std::string strKey = "117:OD210_026_005246_001-IZRTKyEx";
|
|
|
- /* 取出该设备的Key */
|
|
|
- std::vector<std::string> vecKey;
|
|
|
- for(const auto& it : info.vecAction)
|
|
|
- {
|
|
|
- std::string strKey = std::to_string(info.DeviceID) + ":" + it;
|
|
|
- vecKey.push_back(strKey);
|
|
|
- }
|
|
|
- std::string strRetValue;
|
|
|
- /* 进入线程循环 */
|
|
|
- while (m_threadRunning)
|
|
|
- {
|
|
|
- /* 循环读取这个设备关联的算法信息 */
|
|
|
- for(const auto& it : vecKey)
|
|
|
- {
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "读取Redis信息, Key: {}", it);
|
|
|
- if( !fromRedis.getRedisString(it, strRetValue) )
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
- SPDLOG_LOGGER_TRACE(m_logger, "Redis Value:\n{}", strRetValue);
|
|
|
- /* 解析数据 */
|
|
|
- AlarmInfo alarmInfo;
|
|
|
- alarmInfo.ActionID = it.substr(it.find(":") + 1);
|
|
|
- /* 解析数据 */
|
|
|
- parseRedisBaseData(strRetValue, alarmInfo);
|
|
|
- parseRedisBBoxesData(strRetValue, alarmInfo);
|
|
|
- /* 信息时间有的效性判断,主要是记录Redis数据的有效性,是否长时间没有变化,排查错误时用的
|
|
|
- * 如果数据长时间数据不变,那么超脑那里就挂了,写入日志 */
|
|
|
- isEventTimeVaild(alarmInfo.EventTime);
|
|
|
-
|
|
|
- /* 是否需要写入EQM数据库判断
|
|
|
- * 人员计数和区域人员检测需要多次判断,其他的直接写入即可 */
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- std::this_thread::sleep_for(std::chrono::seconds(2));
|
|
|
- }
|
|
|
-
|
|
|
- return;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
/**
|
|
|
* @brief 分派任务的线程
|
|
|
1、 线程定时刷新房间和摄像机的关联关系,以及和算法Action的关联关系
|
|
@@ -455,26 +457,26 @@ void SPAServer::threadFromRedis(const CameraThreadInfo& info)
|
|
|
*/
|
|
|
void SPAServer::threadDistribution()
|
|
|
{
|
|
|
- SPDLOG_LOGGER_INFO(m_logger, "开启分派任务线程");
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "**************** 开启分派任务线程 ****************");
|
|
|
/* 房间相机关联信息 */
|
|
|
std::list<RoomCameraInfo> listRC;
|
|
|
/* 存储获取到的应用和启用时间的信息 */
|
|
|
std::list<AppAndTimeInfo> listAppAndTime;
|
|
|
- /* 创建连接数据库实例 */
|
|
|
- std::shared_ptr<FromWebAPI> fromWebAPI = std::make_shared<FromWebAPI>();
|
|
|
+
|
|
|
/* 初始化WebAPI */
|
|
|
- // fromWebAPI->initWebApi(const QString &url, const QString &serverIP, const QString &serID)
|
|
|
+ std::shared_ptr<FromWebAPI> pFromWebAPI = std::make_shared<FromWebAPI>();
|
|
|
+ pFromWebAPI->initWebApi(GConfig.webapiUrl(), GConfig.webapiKey(), GConfig.webapiAppType());
|
|
|
|
|
|
while (m_threadRunning)
|
|
|
{
|
|
|
/* ======================================================= */
|
|
|
/* 更新通道名称和摄像机名称信息 */
|
|
|
std::map<int, std::string> mapChannelName;
|
|
|
- m_fromWebAPI.getChannelInfo(mapChannelName);
|
|
|
+ pFromWebAPI->getChannelInfo(mapChannelName);
|
|
|
GConfig.setChannelInfo(mapChannelName);
|
|
|
|
|
|
std::map<int, std::string> mapCameraName;
|
|
|
- m_fromWebAPI.getCameraInfo(mapCameraName);
|
|
|
+ pFromWebAPI->getCameraInfo(mapCameraName);
|
|
|
GConfig.setCameraInfo(mapCameraName);
|
|
|
|
|
|
/* ======================================================= */
|
|
@@ -487,7 +489,7 @@ void SPAServer::threadDistribution()
|
|
|
|
|
|
/* ======================================================= */
|
|
|
/* 创建应用信息,根据从EQM数据库读取到的配置的应用信息创建 */
|
|
|
- fromWebAPI->getAlarmAppInfo(listAppAndTime);
|
|
|
+ pFromWebAPI->getAlarmAppInfo(listAppAndTime);
|
|
|
for(const auto& it : listAppAndTime)
|
|
|
{
|
|
|
/* 创建应用信息,如果已有该应用,就更新时间
|
|
@@ -508,7 +510,7 @@ void SPAServer::threadDistribution()
|
|
|
|
|
|
/* 先获取EQM数据库信息,取出房间和摄像机关联信息,包括所在的频率 */
|
|
|
m_mutexActionInfo.lock();
|
|
|
- fromWebAPI->getActionInfo(m_listActionInfo);
|
|
|
+ pFromWebAPI->getActionInfo(m_listActionInfo);
|
|
|
/* 将算法信息加入到不同的功能列表中,先清空功能对应的算法设备列表 */
|
|
|
GThreadInfo.clearActionList();
|
|
|
for(const auto& it : m_listActionInfo.getData())
|
|
@@ -521,15 +523,15 @@ void SPAServer::threadDistribution()
|
|
|
m_mutexActionInfo.unlock();
|
|
|
|
|
|
/* 开启线程 */
|
|
|
- for(const auto& it0 : GThreadInfo.getList())
|
|
|
+ for(const auto& func : GThreadInfo.getList())
|
|
|
{
|
|
|
- if(it0->RunState == RunTimeState::RUN_STATE_INIT)
|
|
|
+ if(func->RunState == RunTimeState::RUN_STATE_INIT)
|
|
|
{
|
|
|
/* 创建实例 */
|
|
|
- FuncBase* pFunc = createFuncInstance(*it0);
|
|
|
+ FuncBase* pFunc = createFuncInstance(*func);
|
|
|
if(pFunc == nullptr)
|
|
|
{
|
|
|
- SPDLOG_LOGGER_ERROR(m_logger, "创建功能实例失败:{}", it0->strFunctionName);
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "创建功能实例失败:{}", func->strFunctionName);
|
|
|
continue;
|
|
|
}
|
|
|
CPPTP.add_task(&FuncBase::thread_task, pFunc);
|
|
@@ -540,7 +542,7 @@ void SPAServer::threadDistribution()
|
|
|
GThreadInfo.unlockRunFAI();
|
|
|
|
|
|
/* 休眠n秒,默认应该是300秒 */
|
|
|
- std::this_thread::sleep_for(std::chrono::seconds(GConfig.CheckSet));
|
|
|
+ std::this_thread::sleep_for(std::chrono::seconds(GVariable.CheckSet));
|
|
|
}
|
|
|
|
|
|
SPDLOG_LOGGER_INFO(m_logger, "分派任务线程退出");
|
|
@@ -571,6 +573,9 @@ FuncBase* SPAServer::createFuncInstance(FuncThreadInfo& info)
|
|
|
else if(info.appFunction == AppFunction::APP_OnWork)
|
|
|
{
|
|
|
/* 人员在岗检测 */
|
|
|
+ auto tmpFunc = new FuncOnAndOffJob();
|
|
|
+ tmpFunc->setFuncThreadInfo(info);
|
|
|
+ pFunc = tmpFunc;
|
|
|
}
|
|
|
else if(info.appFunction == AppFunction::APP_Illegal)
|
|
|
{
|
|
@@ -582,6 +587,9 @@ FuncBase* SPAServer::createFuncInstance(FuncThreadInfo& info)
|
|
|
else if(info.appFunction == AppFunction::APP_Regional)
|
|
|
{
|
|
|
/* 区域人员检测 */
|
|
|
+ auto tmpFunc = new FuncRegionalPersonCount();
|
|
|
+ tmpFunc->setFuncThreadInfo(info);
|
|
|
+ pFunc = tmpFunc;
|
|
|
}
|
|
|
|
|
|
return pFunc;
|
|
@@ -605,14 +613,20 @@ void SPAServer::clearNoneFuncThreadInfo()
|
|
|
else if((*it)->getApp() == AppFunction::APP_OnWork)
|
|
|
{
|
|
|
/* 人员在岗检测 */
|
|
|
+ FuncOnAndOffJob* p = dynamic_cast<FuncOnAndOffJob*>(*it);
|
|
|
+ delete p;
|
|
|
}
|
|
|
else if((*it)->getApp() == AppFunction::APP_Illegal)
|
|
|
{
|
|
|
/* 非法入侵 */
|
|
|
+ FuncIllegalInvasion* p = dynamic_cast<FuncIllegalInvasion*>(*it);
|
|
|
+ delete p;
|
|
|
}
|
|
|
else if((*it)->getApp() == AppFunction::APP_Regional)
|
|
|
{
|
|
|
/* 区域人员检测 */
|
|
|
+ FuncRegionalPersonCount* p = dynamic_cast<FuncRegionalPersonCount*>(*it);
|
|
|
+ delete p;
|
|
|
}
|
|
|
it = m_listFuncBase.erase(it);
|
|
|
}else {
|