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
34
namespace
roboctrl::async
{
35
41
template
<
typename
T =
void
>
42
using
awaitable
= asio::awaitable<T>;
43
44
using
duration = std::chrono::steady_clock::duration;
45
51
class
task_context
:
52
public
utils::singleton_base
<task_context>,
public
logable
<task_context>{
53
public
:
54
using
task_type =
awaitable<>
;
55
57
struct
info_type
{
58
using
owner_type
=
task_context
;
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
133
private
:
134
asio::io_context context_;
135
info_type info_;
136
};
137
138
static_assert
(
utils::singleton_info<task_context::info_type>
);
139
static_assert
(
utils::singleton<task_context>
);
140
151
inline
auto
spawn
(task_context::task_type&& task){
152
roboctrl::get<task_context>
().spawn(std::forward<task_context::task_type>(task));
153
}
154
166
template
<
typename
...Args>
167
inline
auto
post
(
Args
&&...
args
)
168
{
169
roboctrl::get<task_context>
().post(std::forward<Args>(
args
)...);
170
}
171
176
inline
void
run
(){
177
roboctrl::get<task_context>
().run();
178
}
179
188
inline
awaitable<void>
yield
(){
189
co_await
asio::post(asio::use_awaitable);
190
}
191
202
inline
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
211
inline
auto
executor
(){
212
return
roboctrl::get<task_context>
().get_executor();
213
}
214
218
inline
auto
&
io_context
(){
219
return
roboctrl::get<task_context>
().asio_context();
220
}
221
222
inline
void
stop(){
223
roboctrl::get<task_context>
().stop();
224
}
225
}
226
namespace
roboctrl{
227
using namespace
async;
228
}
roboctrl::async::task_context
异步任务上下文类。
Definition
async.hpp:52
roboctrl::async::task_context::asio_context
auto asio_context() -> asio::io_context &
获取asio的io_context。
Definition
async.hpp:129
roboctrl::async::task_context::desc
std::string desc() const
task_context的描述
Definition
async.hpp:115
roboctrl::async::task_context::run
void run()
开始运行任务上下文。
Definition
async.cpp:13
roboctrl::async::task_context::get_executor
auto get_executor()
获取asio的executor。
Definition
async.hpp:122
roboctrl::async::task_context::spawn
void spawn(task_type &&task)
添加一个协程任务到上下文中执行。
Definition
async.cpp:9
roboctrl::async::task_context::post
void post(Fn &&fn, Args &&... args)
添加一个任务到上下文中执行。
Definition
async.hpp:96
roboctrl::log::logable
用于提供日志功能的辅助基类 通过CRTP模式实现,要求派生类实现desc()方法以提供描述信息,在继承时传入派生类自身类型作为模板参数。 继承这个类后,派生类可以方便地使用log_debug、log_i...
Definition
logger.h:178
roboctrl::utils::singleton_base
提供单例模式的单例基类
Definition
singleton.hpp:19
roboctrl::utils::singleton_info
单例信息
Definition
singleton.hpp:46
roboctrl::utils::singleton
Definition
singleton.hpp:51
logger.h
用于日志输出的组件。
multiton.hpp
用于实现多例模式的通用组件。
roboctrl::async
异步上下文相关功能
Definition
async.hpp:34
roboctrl::async::wait_for
awaitable< void > wait_for(const duration &duration)
协程任务等待。
Definition
async.hpp:202
roboctrl::async::yield
awaitable< void > yield()
协程任务等待。用于让出当前函数的执行权。
Definition
async.hpp:188
roboctrl::async::spawn
auto spawn(task_context::task_type &&task)
添加一个协程任务到全局任务上下文中执行。
Definition
async.hpp:151
roboctrl::async::post
auto post(Args &&... args)
添加一个任务到全局任务上下文中执行。
Definition
async.hpp:167
roboctrl::async::run
void run()
运行全局任务上下文。
Definition
async.hpp:176
roboctrl::async::awaitable
asio::awaitable< T > awaitable
协程任务类型。
Definition
async.hpp:42
roboctrl::async::executor
auto executor()
获取全局任务上下文的executor。
Definition
async.hpp:211
roboctrl::async::io_context
auto & io_context()
获取全局任务上下文的io_context。
Definition
async.hpp:218
roboctrl::async::task_context::info_type
Definition
async.hpp:57
include
core
async.hpp
制作者
1.9.8