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
|