XNSim/XNCore_Win/XNThreadObject/XNThreadObject.h

207 lines
5.1 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 XNThreadObject.h
* @author jinchao
* @brief 调度线程类头文件
* @version 1.0
* @date 2024-11-07
*
* @copyright Copyright (c) 2024 XN
*
*/
#pragma once
#include "XNObject/XNObject.h"
namespace XNSim {
struct XNThreadObjectPrivate;
/**
* @brief 调度线程类
* @details 调度所有模型提交的周期性执行函数
*/
class XNCORE_EXPORT XNThreadObject : public XNObject {
XN_METATYPE(XNThreadObject, XNObject)
XN_DECLARE_PRIVATE(XNThreadObject)
public:
XNThreadObject() = delete;
/**
* @brief 默认析构函数
*/
virtual ~XNThreadObject();
explicit XNThreadObject(XN_STRING name = "", XN_DOUBLE freq = BASE_RUN_FREQ,
XN_UINT32 priority = 99, XN_UINT32 CPUAff = 0);
public:
/**
* @brief 获取框架对象
* @return 框架对象
*/
XNFrameworkPtr GetFramework();
/**
* @brief 设置框架对象
* @param framework 框架对象
*/
void SetFramework(XNFrameworkPtr framework);
/**
* @brief 线程初始化
* @return true: 初始化成功
* @return false: 初始化失败
*/
XN_BOOL Initialize();
/**
* @brief 仿真控制
* @param objectId: 对象ID
* @param cmd: 仿真控制命令
*/
void SimControl(XN_UINT32 objectId, SimControlCmd cmd);
/**
* @brief 设置线程运行的开始时间
* @param simTime: timespec结构体类型用于线程纳秒睡眠计算的开始时间
* @details 通过设置统一的开始时间,使个线程能同步执行
*/
void SetStartTime(const XN_TIMESPEC &simTime);
/**
* @brief 加入线程
* @details 等待线程结束
*/
void Join();
/**
* @brief 线程脱离
*/
void Detach();
/**
* @brief 获取线程ID
* @return const quint32&: 线程ID
*/
const XN_UINT32 &GetThreadID();
/**
* @brief 设置线程ID
* @param threadID: 线程ID
*/
void SetThreadID(const XN_UINT32 &threadID);
/**
* @brief 获取运行状态
* @return RunStatus: 运行状态枚举
*/
RunStatus GetRunStatus();
/**
* @brief 获取线程运行频率
* @return const double&:线程运行频率
*/
const XN_DOUBLE &GetRunFrequecy();
/**
* @brief 设置线程运行频率
* @param eRunFrequecy: double类型线程运行频率
*/
void SetRunFrequecy(const XN_DOUBLE &dRunFrequecy);
/**
* @brief 获取线程运行优先级
* @return const UINT32&:运行优先级09999最高
*/
const XN_UINT32 &GetRunPriority();
/**
* @brief 设置线程运行优先级
* @param uRunPriority: UINT32类型运行优先级09999最高
*/
void SetRunPriority(const XN_UINT32 &uRunPriority);
/**
* @brief 设置线程CPU亲和性掩码
* @return const UINT32&:
* CPU亲和性掩码按位表示某CPU核是否使用从低到高0表示不使用1表示使用。
* 例如0x00000003表示使用0,1号CPU
*/
const XN_UINT32 &GetCPUAffinity();
/**
* @brief 获取线程CPU亲和性掩码
* @param uCPUAffinity:
* UINT32类型CPU亲和性掩码按位表示某CPU核是否使用从低到高0表示不使用1表示使用。
* 例如0x00000003表示使用0,1号CPU
*/
void SetCPUAffinity(const XN_UINT32 &uCPUAffinity);
/**
* @brief 向线程添加周期性函数
* @param fun:XNCallBack函数包装器类型需要提交的函数的包装
* @param freq:FreqLevel类型提交的函数运行频率组
* @param pos:UINT32类型提交的函数运行节点号
* @param
* priorty:UINT32类型提交的函数运行优先级990优先级数值越大优先级越高
* @details 根据运行频率组和节点号向调度线程任务表中添加周期性函数
*/
void AddFunction(XNCallBack fun, FreqLevel freq, XN_UINT32 pos,
XN_UINT32 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(XN_BOOL force = false);
/**
* @brief 执行线程CPU亲和性设置
* @return true: 设置线程CPU亲和性成功
* @return false: 设置线程CPU亲和性失败
*/
XN_BOOL OnSetCPUAffinity();
#ifdef XN_WINDOWS
/**
* @brief 线程主执行函数
* @param args: 线程执行函数输入参数指针
* @return void*: 线程执行函数返回值指针
*/
void ThreadFunction();
#endif
#ifdef XN_LINUX
/**
* @brief 线程主执行函数
* @param args: 线程执行函数输入参数指针
* @return void*: 线程执行函数返回值指针
*/
static void *ThreadFunction(void *args);
#endif
};
XNCLASS_PTR_DECLARE(XNThreadObject)
} // namespace XNSim