|
|
| AbstractScheduler (const nlohmann::json &cfg=nlohmann::json()) |
| | 创建一个调度器
|
| |
| virtual | ~AbstractScheduler () |
| | 销毁调度器
|
| |
| template<class ptr, typename ... Args> |
| ptr * | CreateWorker (Args &&... args) |
| | 从调度器创建一个Worker
|
| |
| void | Start () |
| | 启动调度器
|
| |
|
void | Stop () |
| | 停止调度器,注意停止后无法再次启动调度器,必须重新创建调度器。
|
| |
|
void | SpinOnce () |
| | 进行一次调度,调度器将调度主线程任务(MainThreadTask)中的Worker,并为其他任务队列运行一个新的周期。 如果任务运行过慢,调度器会打印一个警告信息。**请不要在Worker中或者其他线程中调用这个函数,这个函数应该在主线程中调用。 否则会出现未定义行为!**
|
| |
|
void | Spin () |
| | 进行连续任务调度。
|
| |
| size_t | getTimeStamp () |
| | 获取时间辍。
|
| |
| double | getSpinOnceTime () |
| | 获取调度器的时间步长
|
| |
| size_t | CreateTaskList (const std::string &TaskName, size_t div, bool MainThreadTask=false) |
| | 创建一个任务队列,在调度器启动时,Workers中的TaskCreate方法会被调用,用于初始化每个Worker。
|
| |
| void | DestroyTaskList (const std::string &TaskName) |
| | 删除一个任务队列。
|
| |
| bool | EnableTaskList (const std::string &TaskName) |
| | 设置任务列表的启用状态
|
| |
| bool | DisableTaskList (const std::string &TaskName) |
| | 设置任务列表的禁用状态
|
| |
| void | AddWorker (const std::string &TaskName, WorkerType *worker) |
| | 向任务中添加一个工人
|
| |
| void | AddWorkers (const std::string &TaskName, std::vector< WorkerType * > workers) |
| | 批量向任务中添加工人
|
| |
| template<CTString CT, typename T> |
| void | SetData (const T &data) |
| | 从数据中心中获取数据,并自动更新时间戳
|
| |
| template<CTString CT, typename T> |
| size_t | GetData (T &data) |
| | 从数据中心中获取数据
|
| |
| void | PrintSplitLine (size_t length=60, char c='-') |
| | print a split line, default length is 60 and character is '-'
|
| |
|
|
std::atomic< bool > | CanSpin = false |
| |
|
std::thread::id | threadId |
| | main thread id
|
| |
|
std::map< std::string, TCB * > | TaskList |
| | task list
|
| |
|
TCB * | MainThreadTaskBlock = nullptr |
| | control block of the main thread task
|
| |
|
std::string | MainThreadTaskName |
| | main thread task name
|
| |
|
std::atomic< size_t > | TimeStamp |
| | time stamp
|
| |
|
DataCenter< CTS... > | dataCenter |
| | data center for storing data with time stamp
|
| |
|
std::mutex | SyncMutex |
| | task list sync mutex
|
| |
|
std::condition_variable | SyncLock |
| | task list sync lock variable
|
| |
|
std::vector< WorkerType * > | ManagedWorkers |
| | worker list, these workers are created by the scheduler and managed by the scheduler.
|
| |
|
std::weak_ptr< AbstractScheduler< CTS... > > | weak_ptr |
| | weak pointer to the scheduler, used for worker to access scheduler
|
| |
|
double | spin_dt = 0.001 |
| | task list spin once time
|
| |
|
double | HistorySpinDt = 0 |
| |
|
std::chrono::steady_clock::time_point | last_time |
| |
|
bool | CheckFrequency__ = true |
| |
template<
CTSPair ... CTS>
class z::AbstractScheduler< CTS >
AbstractScheduler 调度器类型,用于管理任务,工作线程和数据。
调度器类型是CtrlZ框架的核心类型之一,用于管理任务和工作线程,和工人类(Workers)负责执行每一个具体的任务不同, 调度器类型主要负责管理任务和工作线程。通过在调度器类型中创建任务队列(TaskList),并在这些任务队列中添加工作线程(Workers), 调度器类型可以实现多任务调度,每一个任务队列(TaskList)都有一个独立的线程,用于调度这个任务队列中的工作线程。在运行过程中,调度器会根据 任务流水线中Worker的顺序在每个流水线循环中依次调用Worker的TaskCycleBegin, TaskRun和TaskCycleEnd方法,在任务开始和结束的时候还会调用TaskCreate和TaskDestroy方法。 通过这些方法,工作线程可以在任务开始和结束的时候进行初始化和销毁工作,而在任务运行的时候进行具体的工作。 此外调度器还可以为不同的任务队列设置不同的调度周期,通过设置调度周期,可以实现不同任务队列的不同调度频率,从而实现不同任务队列的不同调度速度。 调度器分为主线程任务(MainThreadTask)和其他任务队列,主线程任务是一个特殊的任务队列,它是在主线程中运行的,而其他任务队列是在独立的线程中运行的。其他任务队列的频率 可以通过设置调度周期来调整,可以设置为主任务队列的整数倍分频(1/n),而主任务队列的频率是固定的,受spinOnce函数的调用频率控制。 调度器类型还可以管理数据管线(DataCenter),用于存储和获取数据,数据管线中的数据通过时间戳来进行读写数据,存储在数据中心中的数据 都是线程安全的,可以在任何线程中读写数据。同时时间辍的存在保证了数据的时序性。
- 模板参数
-
| CTS | 用于数据中心的键-类型对。其中键是一个编译期字符串常量,类型是数据的类型,通常是一个数字或者一个array。 这些键-类型对用于标识数据中心中的数据,通过键可以获取对应的数据, 通过类型可以确定数据的类型。而且这些键-类型对是在编译期就确定的, 保证了数据的唯一性。具体的使用方法可以参考CTSPair类,CTString类和DataCenter类。 |