/** * @file XNThread.h * @author jinchao * @brief 调度线程类头文件 * @version 1.0 * @date 2024-11-07 * * @copyright Copyright (c) 2024 XN * */ #pragma once #include #include #include "XNCore_global.h" class XNThreadPrivate; /** * @brief 调度线程类 * @details 调度所有模型提交的周期性执行函数 */ class XNCORE_EXPORT XNThread : public QObject { Q_OBJECT Q_DISABLE_COPY(XNThread) Q_DECLARE_PRIVATE(XNThread) public: explicit XNThread(QObject *parent = nullptr); XNThread(QObject *parent = nullptr, QString name = "", FreqLevel freq = FreqLevel::BaseFreq, quint32 priority = 99, quint32 CPUAff = 0, double RunInter = BASE_RUN_INTER); protected: XNThreadPrivate *d_ptr; public: /** * @brief 默认析构函数 */ virtual ~XNThread(); /** * @brief 线程初始化 * @return true: 初始化成功 * @return false: 初始化失败 */ bool Initialize(); public slots: /** * @brief 仿真控制 * @param objectId: 对象ID * @param cmd: 仿真控制命令 */ void OnSimControl(quint32 objectId, SimControlCmd cmd); /** * @brief 设置线程运行的开始时间 * @param simTime: timespec结构体类型,用于线程纳秒睡眠计算的开始时间 * @details 通过设置统一的开始时间,使个线程能同步执行 */ void OnSetStartTime(const timespec &simTime); /** * @brief 设置线程运行间隔 * @param dRunInter: double类型,线程运行间隔,单位纳秒 */ void SetRunInter(const double &dRunInter); /** * @brief 加入线程 * @details 等待线程结束 */ void Join(); /** * @brief 线程脱离 */ void Detach(); public: /** * @brief 获取线程ID * @return const quint32&: 线程ID */ const quint32 &GetThreadID(); /** * @brief 设置线程ID * @param threadID: 线程ID */ void SetThreadID(const quint32 &threadID); /** * @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 获取运行状态 * @return RunStatus: 运行状态枚举 */ RunStatus GetRunStatus(); /** * @brief 获取线程运行频率族 * @return const FreqLevel&:线程运行频率族 */ const FreqLevel &GetRunFrequecy(); /** * @brief 设置线程运行频率族 * @param eRunFrequecy: FreqLevel枚举类,线程运行频率族 */ void SetRunFrequecy(const FreqLevel &eRunFrequecy); /** * @brief 获取线程运行优先级 * @return const UINT32&:运行优先级,0~99,99最高 */ const quint32 &GetRunPriority(); /** * @brief 设置线程运行优先级 * @param uRunPriority: UINT32类型,运行优先级,0~99,99最高 */ void SetRunPriority(const quint32 &uRunPriority); /** * @brief 设置线程CPU亲和性掩码 * @return const UINT32&: CPU亲和性掩码,按位表示某CPU核是否使用,从低到高,0表示不使用,1表示使用。 * 例如:0x00000003表示使用0,1号CPU */ const quint32 &GetCPUAffinity(); /** * @brief 获取线程CPU亲和性掩码 * @param uCPUAffinity: UINT32类型,CPU亲和性掩码,按位表示某CPU核是否使用,从低到高,0表示不使用,1表示使用。 * 例如:0x00000003表示使用0,1号CPU */ void SetCPUAffinity(const quint32 &uCPUAffinity); /** * @brief 向线程添加周期性函数 * @param fun:XNCallBack函数包装器类型,需要提交的函数的包装 * @param freq:FreqLevel类型,提交的函数运行频率组 * @param pos:UINT32类型,提交的函数运行节点号 * @param priorty:UINT32类型,提交的函数运行优先级,99~0,优先级数值越大,优先级越高 * @details 根据运行频率组和节点号向调度线程任务表中添加周期性函数 */ void AddFunction(XNCallBack fun, FreqLevel freq, quint32 pos, quint32 priorty); private: /** * @brief 执行线程CPU亲和性设置 * @return true: 设置线程CPU亲和性成功 * @return false: 设置线程CPU亲和性失败 */ bool OnSetCPUAffinity(); /** * @brief 线程主执行函数 * @param args: 线程执行函数输入参数指针 * @return void*: 线程执行函数返回值指针 */ static void *ThreadFunction(void *args); /** * @brief 初始化周期性函数表 */ void InitialFunPool(); };