/** * @file XNThreadManager.h * @author jinchao * @brief 线程管理器类头文件 * @version 1.0 * @date 2024-11-06 * * @copyright Copyright (c) 2024 XN * */ #pragma once #include "XNBaseFrameObject.h" struct XNThreadManagerPrivate; /** * @brief 线程管理器类 * @details 主要负责创建、管理与控制模型调度线程,并向调度线程中添加需要调度执行的模型周期性函数 */ class XNThreadManager : public XNBaseFrameObject { XN_METATYPE(XNThreadManager, XNBaseFrameObject) XN_DECLARE_PRIVATE(XNThreadManager) public: /** * @brief 线程管理器类默认构造函数 */ XNThreadManager(); /** * @brief 线程管理器类析构函数 */ virtual ~XNThreadManager(); protected: /** * @brief 线程管理器类带参构造函数 * @param dd:XNThreadManagerPrivate类型,私有结构体指针 * @param parent:QObject类型,父对象指针 * @details 子类构造时调用此构造函数,传入子类的私有结构体指针 */ XNThreadManager(PrivateType *p); public: /** * @brief 开始控制 * @details 控制线程管理器开始运行接口 */ void Start(); /** * @brief 停止控制 * @details 控制线程管理器停止运行接口 */ void Abort(); /** * @brief 暂停控制 * @details 控制线程管理器暂停运行接口 */ void Pause(); /** * @brief 继续控制 * @details 控制线程管理器继续运行接口 */ void Continue(); /** * @brief 初始化线程管理器 * @return true: 初始化成功 * @return false: 初始化失败 * @details 线程管理器的初始化接口函数 */ virtual bool Initialize() override; /** * @brief 仿真运行前最后处理 * @note 线程管理器在所有线程开始执行前的准备工作 */ virtual bool PrepareForExecute() override; /** * @brief 设置线程频率 * @param threadID: UINT32类型,线程ID * @param freq: double类型,线程频率 * @details 设置线程频率接口 */ void SetThreadFreqByID(uint32_t threadID, double freq); /** * @brief 获取线程频率 * @param threadID: UINT32类型,线程ID * @return double: 线程频率 * @details 获取线程频率接口 */ double GetThreadFreqByID(uint32_t threadID); /** * @brief 仿真控制 * @param objectId: 对象ID * @param cmd: 仿真控制命令 */ void SimControl(uint32_t objectId, SimControlCmd cmd); /** * @brief 获取运行状态 * @return RunStatus: 枚举类,线程运行状态 * @details 获取线程管理器运行状态接口 */ RunStatus GetStatus(); /** * @brief 获取线程数量 * @return quint32: 线程数量 */ uint32_t GetThreadCount(); /** * @brief 添加一个线程 * @param name: XNString类型,线程名称 * @param freq: double类型,线程运行频率,单位Hz * @param priority: UINT32类型,线程运行优先级,99~0,优先级数值越大,优先级越高 * @param CPUAff: UINT32类型,线程的CPU亲和性掩码,按位表示某CPU核是否使用,从低到高,0表示不使用,1表示使用。 * 例如:0x00000003表示使用0,1号CPU * @details 按照设置的参数创建线程 */ virtual uint32_t AddThreadPool(std::string name, double freq, uint32_t priority, uint32_t CPUAff); /** * @brief 向线程中添加周期性函数 * @param id: UINT32类型,模型全局唯一ID * @param fun: XNCallBack函数包装器类型,需要提交的函数的包装 * @param threadID: UINT32类型,线程ID * @param freqGroup: UINT32类型,提交的函数运行频率组,0为基频,1为半频,2为1/4频,3为1/8频,4为1/16频,5为1/32频 * @param RunPos: UINT32类型,提交的函数运行节点号,<2^(freqGroup) * @param RunPriorty: UINT32类型,提交的函数运行优先级,99~0,优先级数值越大,优先级越高 * @return true: 添加成功 * @return false: 添加失败 * @details 根据运行频率组和节点号向对应的线程中添加周期性函数 */ void RegisterFunction(uint32_t id, XNCallBack fun, uint32_t threadID, uint32_t freqGroup, uint32_t RunPos, uint32_t RunPriorty); private: /** * @brief 注册函数校验 * @param freqGroup: UINT32类型,提交的函数运行频率组,0为基频,1为半频,2为1/4频,3为1/8频,4为1/16频,5为1/32频 * @param RunPos: UINT32类型,提交的函数运行节点号,<2^(freqGroup) * @return true:提交的函数频率与节点号符合规则 * @return false:提交的函数频率与节点号不符合规则 */ bool IsFunParamRight(uint32_t ModelID, uint32_t freqGroup, uint32_t RunPos); uint32_t AllocateThreadID(); };