asio定时器深度探析_expires_after-CSDN博客
asio::io_context
是Asio库中的一个I/O执行环境,而asio::steady_timer
是一个与asio::io_context
关联的定时器,可以用来在给定的时间点执行一个函数或者是在一个固定的时间间隔后执行一个函数。
以下是一个创建asio::steady_timer
的例子
#include <iostream>
#include <chrono>
#include <asio.hpp>
int main()
{
asio::io_context io_context;
asio::steady_timer timer(io_context, std::chrono::seconds(5));
timer.async_wait([](const asio::error_code& error)
{
if (!error)
{
std::cout << "Timer expired." << std::endl;
}
});
io_context.run();
return 0;
}
在这个例子中,我们创建了一个asio::io_context
,然后创建了一个asio::steady_timer
,并设置了它在5秒后过期。然后我们注册了一个异步等待操作,并在定时器到期时会打印一条消息。最后,我们运行I/O执行环境。
注意,asio::steady_timer
是与特定的I/O执行环境(asio::io_context
)关联的,因此在创建asio::steady_timer
时需要传入一个asio::io_context
。
另外,asio::steady_timer
的构造函数接受一个时间参数,这个参数表示定时器何时应该过期。在这个例子中,我们使用了std::chrono::seconds(5)
来指定5秒后过期。
最后,timer.async_wait
函数用于注册一个异步等待操作,当定时器到期时,给定的回调函数会被调用。在回调函数中,我们检查错误代码,如果没有错误,则输出一条消息。
io_context.run()
是执行异步操作所必需的,它会阻塞直到所有注册的异步操作都完成。
#include <iostream>
#include <asio.hpp>
#include <thread>
using namespace std;
struct logic
{
int count = 0;
};
class c_timer
{
public:
c_timer(asio::io_context &io):v_io(io),v_t(io)
{
v_t.expires_after(asio::chrono::seconds(5));
}
void start(logic &gc)
{
v_t.async_wait([this,&gc](const std::error_code &ec) {
cout << "this is timer here" << endl;
gc.count++;
v_t.expires_after(asio::chrono::seconds(5));
start(gc);
});
}
private:
asio::io_context &v_io;
asio::steady_timer v_t;
};
int main()
{
logic lg;
thread th([&lg]() {
asio::io_context io;
c_timer timer(io);
timer.start(lg);
io.run();
return 0;
});
while (1)
{
cout << "the count is " << lg.count<<endl;
std::this_thread::sleep_for(std::chrono::seconds(5));
}
}
定时器总结
1 、asio.run并非一直阻塞,而是根据用户需求来阻塞
2 、多使用c++11 lamba来使用函数,更为简便
3、利用线程和定时器结合是一个很好的选择。