asio(二)、异步定时器

该教程介绍了如何利用ASIO库中的异步定时器功能。通过创建一个io_context对象和steady_timer,然后调用async_wait方法并传入一个完成处理程序(print函数),在计时器超时时执行该处理程序。io_context的run方法保证了处理程序在适当的时候被调用,并且只有当有工作需要处理时才会继续运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官网教程:https://think-async.com/Asio/asio-1.26.0/doc/asio/tutorial/tuttimer2.html

asio的异步定时器功能

#include <iostream>
#include <asio.hpp>

使用asio的异步功能意味着提供一个完成令牌,该令牌决定异步操作完成时如何将结果传递给完成处理程序。在这个程序中,我们定义了一个名为print的函数,当异步等待结束时调用它。

void print(const asio::error_code& /*e*/)
{
	std::cout << "Hello, world!" << std::endl;
}

int main()
{
	asio::io_context io;
	asio::steady_timer t(io, asio::chrono::seconds(5));	

接下来,我们不再像教程Timer.1中那样进行阻塞等待,而是调用steady_Timer::async_wait()函数来执行异步等待。当调用这个函数时,我们传递上面定义的打印函数。

	t.async_wait(&print);

最后,我们必须在io_context对象上调用io_context::run()成员函数。

asio库保证只从当前调用io_context::run()的线程调用完成处理程序。因此,除非调用io_context::run()函数,否则将永远不会调用异步等待完成的完成处理程序。

io_context::run()函数也将在还有“工作”要做的时候继续运行。在本例中,工作是对计时器的异步等待,因此在计时器到期并且返回完成处理程序之前,调用不会返回。

在调用io_context::run()之前,请记住给io_context一些工作要做。例如,如果我们省略了上面对steady_timer::async_wait()的调用,那么io_context将没有任何工作要做,因此io_context::run()将立即返回。

	io.run();
	return 0;
}
#include <iostream>
#include <asio.hpp>

void print(const asio::error_code& /*e*/)
{
	std::cout << "Hello, world!" << std::endl;
}

int main()
{
	asio::io_context io;

	asio::steady_timer t(io, asio::chrono::seconds(5));
	t.async_wait(&print);

	io.run();

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值