XNSim/XNCore_Win/XNThreadManager/XNThreadManager.h

167 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file XNThreadManager.h
* @author jinchao
* @brief 线程管理器类头文件
* @version 1.0
* @date 2024-11-06
*
* @copyright Copyright (c) 2024 XN
*
*/
#pragma once
#include "XNBaseFrameObject/XNBaseFrameObject.h"
namespace XNSim {
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 XN_BOOL Initialize() override;
/**
* @brief 仿真运行前最后处理
* @note 线程管理器在所有线程开始执行前的准备工作
*/
virtual XN_BOOL PrepareForExecute() override;
/**
* @brief 设置线程频率
* @param threadID: UINT32类型线程ID
* @param freq: double类型线程频率
* @details 设置线程频率接口
*/
void SetThreadFreqByID(XN_UINT32 threadID, XN_DOUBLE freq);
/**
* @brief 获取线程频率
* @param threadID: UINT32类型线程ID
* @return double: 线程频率
* @details 获取线程频率接口
*/
XN_DOUBLE GetThreadFreqByID(XN_UINT32 threadID);
/**
* @brief 仿真控制
* @param objectId: 对象ID
* @param cmd: 仿真控制命令
*/
void SimControl(XN_UINT32 objectId, SimControlCmd cmd);
/**
* @brief 获取运行状态
* @return RunStatus: 枚举类,线程运行状态
* @details 获取线程管理器运行状态接口
*/
RunStatus GetStatus();
/**
* @brief 获取线程数量
* @return quint32: 线程数量
*/
XN_UINT32 GetThreadCount();
/**
* @brief 添加一个线程
* @param name: XNString类型线程名称
* @param freq: double类型线程运行频率单位Hz
* @param priority:
* UINT32类型线程运行优先级990优先级数值越大优先级越高
* @param CPUAff:
* UINT32类型线程的CPU亲和性掩码按位表示某CPU核是否使用从低到高0表示不使用1表示使用。
* 例如0x00000003表示使用0,1号CPU
* @details 按照设置的参数创建线程
*/
virtual XN_UINT32 AddThreadPool(XN_STRING name, XN_DOUBLE freq,
XN_UINT32 priority, XN_UINT32 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类型提交的函数运行优先级990优先级数值越大优先级越高
* @return true: 添加成功
* @return false: 添加失败
* @details 根据运行频率组和节点号向对应的线程中添加周期性函数
*/
void RegisterFunction(XN_UINT32 id, XNCallBack fun, XN_UINT32 threadID,
XN_UINT32 freqGroup, XN_UINT32 RunPos,
XN_UINT32 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(XN_UINT32 ModelID, XN_UINT32 freqGroup,
XN_UINT32 RunPos);
XN_UINT32 AllocateThreadID();
};
} // namespace XNSim