函数 main()
首先定义了一个 I/O 服务 io_service,用于初始化 I/O 对象 timer。 就象 boost::asio::deadlinetimer
那样,所有 I/O 对象通常都需要一个 I/O 服务作为它们的构造函数的第一个参数。 由于 _timer 的作用类似于一个闹钟,所以 boost::asio::deadlinetimer
的构造函数可以传入第二个参数,用于表示在某个时间点或是在某段时长之后闹钟停止。 以上例子指定了五秒的时长,该闹钟在 _timer 被定义之后立即开始计时。
虽然我们可以调用一个在五秒后返回的函数,但是通过调用方法 async_wait()
并传入 handler()
函数的名字作为唯一参数,可以让 Asio 启动一个异步操作。 请留意,我们只是传入了 handler()
函数的名字,而该函数本身并没有被调用。
象 async_wait()
这样的方法被称为是非阻塞式的。 I/O 对象通常还提供了阻塞式的方法,可以让执行流在特定操作完成之前保持阻塞。 例如,可以调用阻塞式的 wait()
方法,取代 boost::asio::deadline_timer
的调用。 由于它会阻塞调用,所以它不需要传入一个函数名,而是在指定时间点或指定时长之后返回。
再看看上面的源代码,可以留意到在调用 async_wait()
之后,又在 I/O 服务之上调用了一个名为 run()
的方法。这是必须的,因为控制权必须被操作系统接管,才能在五秒之后调用 handler()
函数。
- #include <boost/asio.hpp>
- #include <iostream>
- void handler1(const boost::system::error_code &ec)
- {
- std::cout << "5 s." << std::endl;
- void handler2(const boost::system::error_code &ec)
- {
- std::cout << "10 s." << std::endl;
- }
- int main()
- boost::asio::io_service io_service;
- boost::asio::deadline_timer timer1(io_service, boost::posix_time::seconds(5));
- timer1.async_wait(handler1);
- boost::asio::deadline_timer timer2(io_service, boost::posix_time::seconds(10));
- timer2.async_wait(handler2);
- io_service.run();
- }
上面的程序用了两个 类型的 I/O 对象。 第一个 I/O 对象表示一个五秒后触发的闹钟,而第二个则表示一个十秒后触发的闹钟。 每一段指定时长过去后,都会相应地调用函数 handler1()
和 handler2()
。
在 main()
的最后,再次在唯一的 I/O 服务之上调用了 run()
方法。 如前所述,这个函数将阻塞执行,把控制权交给操作系统以接管异步处理。 在操作系统的帮助下,handler1()
函数会在五秒后被调用,而 handler2()
函数则在十秒后被调用。
一旦特定的 I/O 服务的所有异步操作都完成了,控制权就会返回给 run()
方法,然后它就会返回。 以上两个例子中,应用程序都会在闹钟到时间后马上结束。