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