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