#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 #include #include #include #include #include #include #include namespace threads { /** * @brief 线程句柄管理器 */ class Manager { public: /** * @brief Construct a new Manager object */ Manager(); /** * @brief Destroy the Manager object * 并销毁其所管理的每一个线程实例 */ ~Manager(); protected: std::map> stored_cfg_data_; std::vector> tid_2_thread_name_; bool is_running_; bool is_start_; std::unique_ptr logger_; std::unique_ptr alarm_logger_; map rule_alg_id_mapping_; std::shared_mutex handles_mutex; map> handles_; std::unique_ptr r_thread_; std::unique_ptr 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(); }; }