#include <boost/asio.hpp>#include <iostream>#include <chrono>#include <functional>using namespace std::chrono_literals;using Clock = std::chrono::high_resolution_clock;using Callback = std::function<void()>;using boost::system::error_code;// simple wrapper that makes it easier to repeat on fixed intervalsstruct interval_timer { interval_timer(boost::asio::io_context& io, Clock::duration i, Callback cb) : interval(i), callback(cb), timer(io) { run(); } private: void run() { timer.expires_from_now(interval); timer.async_wait([=](error_code ec) { if (!ec) { callback(); run(); } }); } Clock::duration const interval; Callback callback; boost::asio::high_resolution_timer timer;};int main() { boost::asio::io_context io; interval_timer abc { io, 200ms, [] { std::cout << "TEST_ABC" << std::endl; } }; interval_timer counter { io, 1s, [current=0]() mutable { std::cout << "COUNTER AT " << ++current << std::endl; } }; io.run_for(5s);}返回C ++ 98 没有lambda.好的,我们可以使用 boost :: bind 或自己编写一些类.您选择了毒药,我选择了一种混合物:Back to C++98No lambda's. Okay, we can use boost::bind or just write some classes ourselves. You pick your poison, I chose a mixture: boost :: bind ,因为它是那个时代的工具(我们正在谈论20年前)使用虚拟方法代替 std :: function 进行回调. lambda捕获已替换为显式成员变量.boost::bind because it was the tool of that era (we're talking 20 years ago)using virtual method instead of std::function for the callback.The lambda captures have been replaced with explicit member variables.这一切变得不那么优雅了,但基本上可以识别为同一件事:It all becomes a lot less elegant, but basically recognizable as the same thing: 在Coliru上直播Live On Coliru#include <boost/asio.hpp>#include <iostream>#include <boost/bind.hpp>using boost::posix_time::seconds;using boost::posix_time::millisec;typedef boost::posix_time::microsec_clock Clock;using boost::system::error_code;// simple wrapper that makes it easier to repeat on fixed intervalsstruct interval_timer { interval_timer(boost::asio::io_context& io, millisec i) : interval(i), timer(io) { run(); } virtual bool callback() = 0; void run() { timer.expires_from_now(interval); timer.async_wait(boost::bind(&interval_timer::on_timer, this, boost::asio::placeholders::error())); } void stop() { timer.cancel(); } private: void on_timer(error_code ec) { if (!ec && callback()) run(); } millisec const interval; boost::asio::deadline_timer timer;};int main() { boost::asio::io_context io; struct abc_timer : interval_timer { abc_timer(boost::asio::io_context& io, millisec i) : interval_timer(io, i) {} virtual bool callback() { std::cout << "TEST_ABC" << std::endl; return true; } } abc(io, millisec(200)); struct counter_timer : interval_timer { counter_timer(boost::asio::io_context& io, millisec i, interval_timer& abc) : interval_timer(io, i), abc(abc), current(0) {} virtual bool callback() { std::cout << "COUNTER AT " << ++current << std::endl; if (current < 5) return true; abc.stop(); return false; } private: interval_timer& abc; int current; } counter(io, millisec(1000), abc); io.run();}输出仍然是可信赖的TEST_ABCTEST_ABCTEST_ABCTEST_ABCCOUNTER AT 1TEST_ABCTEST_ABCTEST_ABCTEST_ABCTEST_ABCCOUNTER AT 2TEST_ABCTEST_ABCTEST_ABCTEST_ABCTEST_ABCCOUNTER AT 3TEST_ABCTEST_ABCTEST_ABCTEST_ABCTEST_ABCCOUNTER AT 4TEST_ABCTEST_ABCTEST_ABCTEST_ABCTEST_ABCCOUNTER AT 5 这篇关于C ++ Boost异步计时器与程序并行运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!