c++ - 如何等待两个计时器中的任何一个完成(Boost Asio)
问题描述
当两者 都完成时timer1
,下面的代码将打印到控制台。timer2
如何将其更改为在其中一个或完成时打印, timer1
然后timer2
取消另一个计时器。
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
int main() {
boost::asio::io_context io;
boost::asio::deadline_timer timer1(io, boost::posix_time::seconds(5));
boost::asio::deadline_timer timer2(io, boost::posix_time::seconds(1));
boost::asio::spawn(io, [&](boost::asio::yield_context yield){
timer1.async_wait(yield);
timer2.async_wait(yield);
std::cout << "Both timer1 and timer2 have finished" << std::endl;
});
io.run();
}
解决方案
怎么样:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
void print_timer_expired( bool& flag)
{
if( flag )
return;
flag = true;
std::cout << "Timer1 or timer2 has finished" << std::endl;
}
int main() {
boost::asio::io_context io;
bool flag = false; // true if message has been printed
boost::asio::deadline_timer timer1(io, boost::posix_time::seconds(5));
boost::asio::deadline_timer timer2(io, boost::posix_time::seconds(1));
boost::asio::spawn(io, [&](boost::asio::yield_context yield){
timer1.async_wait(yield);
print_timer_expired( flag );
});
boost::asio::spawn(io, [&](boost::asio::yield_context yield){
timer2.async_wait(yield);
print_timer_expired( flag );
});
io.run();
}
推荐阅读
- reactjs - 在 react-select-search 输入名称时,结果被填充
- javascript - 如何从具有不同域的 iFrame 发送帖子消息?
- php - 如何解析和获取来自给定网址的元标记的图像和描述?
- laravel - Laravel 存储图像未加载
- php - 如何在共享主机中使用 PHP 在视频上添加文本水印
- c++ - С++ Microsoft MFC TreeView 图标
- docker-compose - Jenkins CI 与 docker-compose - 如何正确停止容器
- java - google Safebrowsing api v4 总是返回空响应
- python - Remove quotations that surrounds substring but keep standalone quotes
- reactjs - 反应按钮 onClick 正确绑定,但无法正常工作