XNSim/XNCore/XNThread.h

197 lines
4.6 KiB
C++
Executable File
Raw Permalink 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 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&:运行优先级09999最高
*/
const uint32_t &GetRunPriority();
/**
* @brief 设置线程运行优先级
* @param uRunPriority: UINT32类型运行优先级09999最高
*/
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类型提交的函数运行优先级990优先级数值越大优先级越高
* @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)