eis/eqpalg/threads/manager.h

174 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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