207 lines
5.1 KiB
C
207 lines
5.1 KiB
C
|
/**
|
|||
|
* @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&:运行优先级,0~99,99最高
|
|||
|
*/
|
|||
|
const XN_UINT32 &GetRunPriority();
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 设置线程运行优先级
|
|||
|
* @param uRunPriority: UINT32类型,运行优先级,0~99,99最高
|
|||
|
*/
|
|||
|
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类型,提交的函数运行优先级,99~0,优先级数值越大,优先级越高
|
|||
|
* @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
|