GKD.RoboCtrl
载入中...
搜索中...
未找到
async.hpp
浏览该文件的文档.
1
13#pragma once
14#include <chrono>
15#include <format>
16#include <utility>
17#include <asio.hpp>
18#include <asio/awaitable.hpp>
19#include <asio/io_context.hpp>
20#include <asio/steady_timer.hpp>
21#include <asio/use_awaitable.hpp>
22
23#include "multiton.hpp"
24#include "core/logger.h"
25#include "utils/singleton.hpp"
26
35
41template<typename T = void>
42using awaitable = asio::awaitable<T>;
43
44using duration = std::chrono::steady_clock::duration;
45
52 public utils::singleton_base<task_context>,public logable<task_context>{
53public:
54 using task_type = awaitable<>;
55
57 struct info_type{
59 };
60
61 explicit task_context();
62
78 void spawn(task_type&& task);
79
95 template<typename Fn, typename... Args>
96 inline void post(Fn&& fn, Args&&... args) {
97 asio::post(context_,
98 [fn = std::forward<Fn>(fn),
99 args = std::make_tuple(std::decay_t<Args>(std::forward<Args>(args))...)]() mutable {
100 return std::apply(std::move(fn), std::move(args));
101 });
102 }
103
107 void run();
108
109 void stop();
110
112 bool init(info_type _info);
113
115 inline std::string desc()const{
116 return std::format("async task context");
117 }
118
122 inline auto get_executor(){
123 return context_.get_executor();
124 }
125
129 inline auto asio_context() -> asio::io_context&{
130 return context_;
131 }
132
133private:
134 asio::io_context context_;
135 info_type info_;
136};
137
139static_assert(utils::singleton<task_context>);
140
151inline auto spawn(task_context::task_type&& task){
152 roboctrl::get<task_context>().spawn(std::forward<task_context::task_type>(task));
153}
154
166template<typename ...Args>
167inline auto post(Args&&... args)
168{
169 roboctrl::get<task_context>().post(std::forward<Args>(args)...);
170}
171
176inline void run(){
178}
179
189 co_await asio::post(asio::use_awaitable);
190}
191
202inline awaitable<void> wait_for(const duration& duration){
203 auto ex = roboctrl::get<task_context>().get_executor();
204 asio::steady_timer timer(ex, duration);
205 co_await timer.async_wait(asio::use_awaitable);
206}
207
211inline auto executor(){
212 return roboctrl::get<task_context>().get_executor();
213}
214
218inline auto& io_context(){
219 return roboctrl::get<task_context>().asio_context();
220}
221
222inline void stop(){
224}
225}
226namespace roboctrl{
227 using namespace async;
228}
异步任务上下文类。
Definition async.hpp:52
auto asio_context() -> asio::io_context &
获取asio的io_context。
Definition async.hpp:129
std::string desc() const
task_context的描述
Definition async.hpp:115
void run()
开始运行任务上下文。
Definition async.cpp:13
auto get_executor()
获取asio的executor。
Definition async.hpp:122
void spawn(task_type &&task)
添加一个协程任务到上下文中执行。
Definition async.cpp:9
void post(Fn &&fn, Args &&... args)
添加一个任务到上下文中执行。
Definition async.hpp:96
用于提供日志功能的辅助基类 通过CRTP模式实现,要求派生类实现desc()方法以提供描述信息,在继承时传入派生类自身类型作为模板参数。 继承这个类后,派生类可以方便地使用log_debug、log_i...
Definition logger.h:178
提供单例模式的单例基类
Definition singleton.hpp:19
用于日志输出的组件。
用于实现多例模式的通用组件。
异步上下文相关功能
Definition async.hpp:34
awaitable< void > wait_for(const duration &duration)
协程任务等待。
Definition async.hpp:202
awaitable< void > yield()
协程任务等待。用于让出当前函数的执行权。
Definition async.hpp:188
auto spawn(task_context::task_type &&task)
添加一个协程任务到全局任务上下文中执行。
Definition async.hpp:151
auto post(Args &&... args)
添加一个任务到全局任务上下文中执行。
Definition async.hpp:167
void run()
运行全局任务上下文。
Definition async.hpp:176
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:42
auto executor()
获取全局任务上下文的executor。
Definition async.hpp:211
auto & io_context()
获取全局任务上下文的io_context。
Definition async.hpp:218