XNSim/XNCore/XNThreadManager.h

142 lines
4.2 KiB
C++
Executable File
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.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 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类型线程运行优先级990优先级数值越大优先级越高
* @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类型提交的函数运行优先级990优先级数值越大优先级越高
* @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();
};