C++ asio异步定时器作为中断

C++ asio异步定时器作为中断,c++,boost,timer,boost-asio,interrupt,C++,Boost,Timer,Boost Asio,Interrupt,据我所知,我应该能够使用boost:asio异步计时器每n毫秒触发一次回调,而我的程序在不需要线程的情况下执行其他操作。这个假设正确吗 我编写了以下测试程序,它只打印处理程序消息,从不打印rand()值。我想看到的是所有的浮点数在屏幕上向下滚动,然后每隔250ms就会出现一条处理程序消息 代码如下: #include <iostream> #include <vector> #include <cstdlib> #include <boost/asio

据我所知,我应该能够使用boost:asio异步计时器每n毫秒触发一次回调,而我的程序在不需要线程的情况下执行其他操作。这个假设正确吗

我编写了以下测试程序,它只打印处理程序消息,从不打印rand()值。我想看到的是所有的浮点数在屏幕上向下滚动,然后每隔250ms就会出现一条处理程序消息

代码如下:

#include <iostream>
#include <vector>
#include <cstdlib>

#include <boost/asio.hpp>
#include <boost/date_time.hpp>
#include <boost/thread.hpp>

boost::asio::io_service io_service;
boost::posix_time::time_duration interval(boost::posix_time::milliseconds(250));
boost::asio::deadline_timer timer(io_service,interval);

void handler(const boost::system::error_code& error);

void timer_init() {
   timer.expires_at(timer.expires_at()+interval);
   timer.async_wait(handler);
}

void handler(const boost::system::error_code& error) {
   static long count=0;
   std::cout << "in handler " << count++ << std::endl;
   std::cout.flush();
   timer_init();
}

int main(int argc, char **argv) {
   timer.async_wait(handler);
   io_service.run();

   std::vector<double> vec;
   for (long i=0; i<1000000000; i++) {
      double x=std::rand();
      std::cout << x << std::endl;
      std::cout.flush();
      vec.push_back(x);
   }
   return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
boost::asio::io_服务io_服务;
boost::posix_time::time_持续时间间隔(boost::posix_time::毫秒(250));
boost::asio::截止时间计时器(io\u服务,间隔);
无效处理程序(const boost::system::error\u代码和错误);
void timer_init(){
timer.expires_at(timer.expires_at()+间隔);
异步等待(处理器);
}
无效处理程序(const boost::system::error\u代码和错误){
静态长计数=0;
标准::cout这:


是一个阻塞调用。确实,使用ASIO可以在一个线程中异步发生多个事件,但不能让ASIO与未与ASIO集成的代码在同一线程中运行。这是一个经典的事件驱动模型,所有工作都是在响应某个就绪通知(在您的情况下是计时器)时完成的

尝试将向量/随机码移动到一个函数,并将该函数传递给io_service::post(),然后io_service::post()将在其run()方法的上下文中运行该代码。然后,当您调用run()时,这两种情况都会发生(虽然不是真正同时发生,因为这需要线程)。

这:


是一个阻塞调用。确实,使用ASIO可以在一个线程中异步发生多个事件,但不能让ASIO与未与ASIO集成的代码在同一线程中运行。这是一个经典的事件驱动模型,所有工作都是在响应某个就绪通知(在您的情况下是计时器)时完成的


尝试将向量/随机码移动到一个函数中,并将该函数传递给io_服务::post(),然后io_服务::post()将在其run()方法的上下文中运行该代码。然后,当您调用run()时,这两种情况都会发生(虽然不是真正同时发生,因为这需要线程)。

正如John Zwinck所提到的,
io_服务::run()
blocks-它是一个主
asio
循环,用于分派完成处理程序。但是,您可以通过将
io\u服务::poll\u one与循环交错来“手动”处理
io\u服务
队列,而不是调用
run

for (long i=0; i<1000000000; i++) {
      double x=std::rand();
      std::cout << x << std::endl;
      std::cout.flush();
      vec.push_back(x);
      io_service.poll_one();
   }

for(long i=0;i正如John Zwinck提到的,
io_服务::run()
阻塞-它是一个主
asio
循环,用于调度完成处理程序。但是,您可以通过将
io_服务::poll_one
与您的循环交错来“手动”处理
io_服务
队列,而不是调用
run

for (long i=0; i<1000000000; i++) {
      double x=std::rand();
      std::cout << x << std::endl;
      std::cout.flush();
      vec.push_back(x);
      io_service.poll_one();
   }

for(long i=0;i“您不能让ASIO与未与ASIO集成的代码在同一线程中运行”-这并不准确。您可以将主应用程序循环与
poll\u One
调用交错。顺便说一句,如果他
post
完成整个函数,则在函数结束之前不会调用计时器处理程序。“您不能让ASIO与未与ASIO集成的代码在同一线程中运行”-这是不确切的。您可以将主应用程序循环与
poll\u One
调用交错。顺便说一句,如果他
post
调用整个函数,则在函数结束之前不会调用计时器处理程序。