158 lines
4.6 KiB
C++
Executable File
158 lines
4.6 KiB
C++
Executable File
/**
|
||
* @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();
|
||
}; |