#pragma once #include "DataMonitor.h" /** * @brief 数据注入线程类,用于持续向数据监控器注入数据 */ class CSVDataInjectThread { public: /** * @brief 构造函数 * @param csvFilePath CSV文件路径 */ CSVDataInjectThread(std::string csvFilePath); /** * @brief 析构函数 */ ~CSVDataInjectThread(); bool Initialize(std::vector injectDataInfos); /** * @brief 启动数据注入线程 */ void start(); /** * @brief 停止数据注入线程 */ void stop(); /** * @brief 从CSV文件读取下一行数据并更新执行时间 * 如果文件读取完毕,将停止线程 */ void updateData(); bool isRunning() const; private: /** * @brief 线程执行函数 */ void threadFunc(); void parseHeaderField(const std::string &headerField); private: std::string m_csvFilePath; std::ifstream m_csvFile; std::vector m_injectDataInfos; std::vector m_headerFields; std::thread m_thread; ///< 数据注入线程 std::atomic m_running; ///< 线程运行标志 std::mutex m_mutex; ///< 互斥锁 std::condition_variable m_cv; ///< 条件变量 std::unordered_map m_alreadyStartedMonitors; ///< 已经启动的数据监控器 std::unordered_map m_notStartedMonitors; ///< 未启动的数据监控器 std::unordered_map> m_data; ///< 要注入的数据 std::atomic m_nextExecuteTime; ///< 下一次执行的时间点 };