/** * @file XNThread.h * @author jinchao * @brief 调度线程类头文件 * @version 1.0 * @date 2024-11-07 * * @copyright Copyright (c) 2024 XN * */ #pragma once #include "XNObject.h" struct XNThreadPrivate; /** * @brief 调度线程类 * @details 调度所有模型提交的周期性执行函数 */ class XNCORE_EXPORT XNThread : public XNObject { XN_METATYPE(XNThread, XNObject) XN_DECLARE_PRIVATE(XNThread) public: XNThread() = delete; /** * @brief 默认析构函数 */ virtual ~XNThread(); explicit XNThread(std::string name = "", double freq = BASE_RUN_FREQ, uint32_t priority = 99, uint32_t CPUAff = 0); public: /** * @brief 获取框架对象 * @return 框架对象 */ XNFrameworkPtr GetFramework(); /** * @brief 设置框架对象 * @param framework 框架对象 */ void SetFramework(XNFrameworkPtr framework); /** * @brief 线程初始化 * @return true: 初始化成功 * @return false: 初始化失败 */ bool Initialize(); /** * @brief 仿真控制 * @param objectId: 对象ID * @param cmd: 仿真控制命令 */ void SimControl(uint32_t objectId, SimControlCmd cmd); /** * @brief 设置线程运行的开始时间 * @param simTime: timespec结构体类型,用于线程纳秒睡眠计算的开始时间 * @details 通过设置统一的开始时间,使个线程能同步执行 */ void SetStartTime(const timespec &simTime); /** * @brief 加入线程 * @details 等待线程结束 */ void Join(); /** * @brief 线程脱离 */ void Detach(); /** * @brief 获取线程ID * @return const quint32&: 线程ID */ const uint32_t &GetThreadID(); /** * @brief 设置线程ID * @param threadID: 线程ID */ void SetThreadID(const uint32_t &threadID); /** * @brief 获取运行状态 * @return RunStatus: 运行状态枚举 */ RunStatus GetRunStatus(); /** * @brief 获取线程运行频率 * @return const double&:线程运行频率 */ const double &GetRunFrequecy(); /** * @brief 设置线程运行频率 * @param eRunFrequecy: double类型,线程运行频率 */ void SetRunFrequecy(const double &dRunFrequecy); /** * @brief 获取线程运行优先级 * @return const UINT32&:运行优先级,0~99,99最高 */ const uint32_t &GetRunPriority(); /** * @brief 设置线程运行优先级 * @param uRunPriority: UINT32类型,运行优先级,0~99,99最高 */ void SetRunPriority(const uint32_t &uRunPriority); /** * @brief 设置线程CPU亲和性掩码 * @return const UINT32&: CPU亲和性掩码,按位表示某CPU核是否使用,从低到高,0表示不使用,1表示使用。 * 例如:0x00000003表示使用0,1号CPU */ const uint32_t &GetCPUAffinity(); /** * @brief 获取线程CPU亲和性掩码 * @param uCPUAffinity: UINT32类型,CPU亲和性掩码,按位表示某CPU核是否使用,从低到高,0表示不使用,1表示使用。 * 例如:0x00000003表示使用0,1号CPU */ void SetCPUAffinity(const uint32_t &uCPUAffinity); /** * @brief 向线程添加周期性函数 * @param fun:XNCallBack函数包装器类型,需要提交的函数的包装 * @param freq:FreqLevel类型,提交的函数运行频率组 * @param pos:UINT32类型,提交的函数运行节点号 * @param priorty:UINT32类型,提交的函数运行优先级,99~0,优先级数值越大,优先级越高 * @details 根据运行频率组和节点号向调度线程任务表中添加周期性函数 */ void AddFunction(XNCallBack fun, FreqLevel freq, uint32_t pos, uint32_t priorty); private: /** * @brief 控制线程开始 * @return true: 线程启动成功 * @return false: 线程启动失败 */ void Start(); /** * @brief 控制线程暂停 * @return true: 线程暂停成功 * @return false: 线程暂停失败 */ void Pause(); /** * @brief 控制线程继续 * @return true: 线程继续成功 * @return false: 线程继续失败 */ void Continue(); /** * @brief 控制线程停止 * @param force:bool类型,true = 强制停止,flase = 等待当前认为结束后停止 * @return true: 线程停止成功 * @return false: 线程停止失败 */ void Stop(bool force = false); /** * @brief 执行线程CPU亲和性设置 * @return true: 设置线程CPU亲和性成功 * @return false: 设置线程CPU亲和性失败 */ bool OnSetCPUAffinity(); /** * @brief 线程主执行函数 * @param args: 线程执行函数输入参数指针 * @return void*: 线程执行函数返回值指针 */ static void *ThreadFunction(void *args); // /** // * @brief 初始化周期性函数表 // */ //void InitialFunPool(); }; XNCLASS_PTR_DECLARE(XNThread)