174 lines
4.9 KiB
C++
174 lines
4.9 KiB
C++
#pragma once
|
||
/**
|
||
* @file manager.h
|
||
* @brief 线程管理
|
||
* @author your name (you@domain.com)
|
||
* @version 0.1
|
||
* @date 2024-03-28
|
||
*
|
||
* Copyright: Baosight Co. Ltd.
|
||
* DO NOT COPY/USE WITHOUT PERMISSION
|
||
*
|
||
*/
|
||
#include <eqpalg/build_algorithm.h>
|
||
#include <eqpalg/threads/handler_exec.h>
|
||
#include <eqpalg/utility/alarm_handler.hpp>
|
||
#include <memory>
|
||
#include <shared_mutex>
|
||
#include <string>
|
||
#include <thread>
|
||
#include <utility>
|
||
namespace threads {
|
||
/**
|
||
* @brief 线程句柄管理器
|
||
*/
|
||
class Manager {
|
||
public:
|
||
/**
|
||
* @brief Construct a new Manager object
|
||
*/
|
||
Manager();
|
||
|
||
/**
|
||
* @brief Destroy the Manager object
|
||
* 并销毁其所管理的每一个线程实例
|
||
*/
|
||
~Manager();
|
||
|
||
protected:
|
||
std::map<std::string, std::tuple<int, std::string, mix_cc::json, bool, double,
|
||
double, int>>
|
||
stored_cfg_data_; ///< 存储的配置信息,用于初始化单次执行信息和重新载入算法时组织信息
|
||
|
||
std::vector<std::tuple<std::thread::id, std::string>>
|
||
tid_2_thread_name_; ///< 进程id到进程名的关系
|
||
|
||
bool is_running_; ///< 是否正在运行
|
||
bool is_start_; ///< 是否调用了start
|
||
std::unique_ptr<LOG> logger_; ///< 本地logger
|
||
std::unique_ptr<LOG> alarm_logger_; ///< 本地alarm_logger_
|
||
map<string, string> rule_alg_id_mapping_; ///< id和规则的对应关系
|
||
std::shared_mutex handles_mutex; // 针对handles_的互斥锁
|
||
map<std::string, std::unique_ptr<HandlerExec>>
|
||
handles_; ///< 监控程序的handles,每个alg_id_datasource_seq一个handle
|
||
|
||
std::unique_ptr<std::thread> r_thread_; ///< 检测工厂运行状态的线程
|
||
|
||
std::unique_ptr<AlarmHandler> alarm_handler_ptr_;
|
||
|
||
int thread_num_ = 0; ///<规则 线程数
|
||
|
||
public:
|
||
/**
|
||
* @brief 保持参数信息到数据集合中
|
||
* @param ruleId 规则id
|
||
* @param alg_id 算法id
|
||
* @param name 规则名
|
||
* @param rule_json 规则配置参数
|
||
* @param usable 规则启停标记
|
||
* @param padding_low 区间下 弃用
|
||
* @param padding_up 区间上 弃用
|
||
* @param task_seq 线程序号
|
||
* @return int 0-正常;其它-异常
|
||
*/
|
||
int storage(const string &ruleId, int alg_id, const string &name,
|
||
const mix_cc::json &rule_json, bool usable, double padding_low,
|
||
double padding_up, int task_seq);
|
||
|
||
/**
|
||
* @brief 程序启动时,载入数据所使用的方法
|
||
* @param ruleId 算法实例id
|
||
* @return int
|
||
*/
|
||
int load(const string &ruleId);
|
||
|
||
/**
|
||
* @brief 启动载入的算法所对应的线程 mon
|
||
* @return int
|
||
*/
|
||
int start();
|
||
|
||
/**
|
||
* @brief 在算法运行过程中,把对应的数据添加到具体线程中
|
||
* @param ruleId 算法实例id
|
||
* @return int
|
||
*/
|
||
int attach(const string &ruleId);
|
||
/**
|
||
* @brief 重置统计
|
||
* 主要用于 6-累计时间
|
||
* 7-出现次数
|
||
* @param ruleId My Param doc
|
||
* @return int
|
||
*/
|
||
int reset(const string &ruleId);
|
||
|
||
/**
|
||
* @brief 取消对应规则
|
||
* @param ruleId 要取消的算法实例id
|
||
* @return int
|
||
*/
|
||
int detach(const string &ruleId);
|
||
|
||
/**
|
||
* @brief 单次执行
|
||
* @param ruleId 算法实例(规则)id
|
||
* @param time_start 单次执行的开始时间
|
||
* @param time_end 单次执行的结束时间
|
||
* @return int
|
||
*/
|
||
int exec_task(std::string ruleId, TimePoint time_start, TimePoint time_end);
|
||
|
||
/**
|
||
* @brief 启用算法/停用算法
|
||
* 应该考虑两个方面:1.当前运行线程中的算法启停用;2.stored_cfg_data_的维护,以便停机开机后,保持算法的启停用状态
|
||
* @param ruleId 算法id
|
||
* @param usable 是否停用/启用
|
||
* @return int
|
||
*/
|
||
int enable(std::string ruleId, bool usable);
|
||
|
||
/**
|
||
* @brief 删除存储的算法实例信息
|
||
* @param ruleId My Param doc
|
||
* @return int
|
||
*/
|
||
int delete_instance(std::string ruleId);
|
||
|
||
protected:
|
||
/**
|
||
* @brief 把数据实例化成算法指针,并完善对应关系
|
||
* @param ruleId 算法实例id
|
||
* @return int
|
||
*/
|
||
int build_alg_to_handle(const string &ruleId);
|
||
|
||
/**
|
||
* @brief 完全抹除某个算法线程
|
||
* @param alg_thread_name 算法线程名
|
||
* @return int
|
||
*/
|
||
int detach_full_alg(std::string alg_thread_name);
|
||
|
||
public:
|
||
/**
|
||
* @brief
|
||
* @param ruleid 规则信息
|
||
* @param lb 下限
|
||
* @param ub 上限
|
||
* @param va 当前值
|
||
* @param stime 开始时间
|
||
* @param etime 结束时间
|
||
*/
|
||
void update_limit_alarm(std::string ruleid, double lb, double ub, double va,
|
||
int64_t stime, int64_t etime);
|
||
|
||
/**
|
||
* @brief Get the thread size object
|
||
* @return int
|
||
*/
|
||
int get_thread_size();
|
||
};
|
||
|
||
} // namespace threads
|