如何在循环中使用boost的deadline_timer :: asynch_wait?

时间:2015-12-14 02:10:21

标签: c++ multithreading boost mfc boost-asio

我正在使用MFC应用程序(VC10),我正在使用deadline_timer :: asynch_wait()在分离的线程中的while循环中运行。事实上,等待时间可能是几分钟甚至更长,我正在使用asych_wait来中断等待。我的问题是,在第一次执行时,只调用一次定时器回调。当循环第二次执行时,不再调用回调。知道我做错了什么吗?

<a>

我的计时器回调如下:

header:
std::unique_ptr<boost::asio::deadline_timer> m_timer;

cpp:
UINT camThread1( LPVOID pParam )
{
  CDlg* pView = (CMyDlg*) pParam;
  boost::asio::io_service io_service;

  // to be able to interrupt the timer from the GUI Thread
  pView->m_timer.reset(new boost::asio::deadline_timer(io_service)); 

  boost::posix_time::ptime lastLoop;
  typedef boost::asio::time_traits<boost::posix_time::ptime> time_traits_t;
  lastLoop = time_traits_t::now();

  while (1)
  {
    boost::posix_time::ptime nextFrameTime;
    // calculate the time to wait
    nextFrameTime = lastFrameTime + boost::posix_time::seconds(pView->m_interval);

    // start the timer
    pView->m_timer->expires_at(nextFrameTime);
    pView->m_timer->async_wait(boost::bind(&CDlg::timer_handler, pView, boost::asio::placeholders::error));
    io_service.run();

    DWORD dwWaitResult = WaitForSingleObject(pView->m_timerEvent, INFINITE);
    switch (dwWaitResult) 
    {
      // check results
    }
    lastLoop = time_traits_t::now(); // get the current time

    // do something
  }
}

我的活动创建如下:

void CDlg::timer_handler(const boost::system::error_code& error)
{
  if (!error || error == boost::asio::error::operation_aborted)
  {
    SetEvent(m_timerEvent);
  } else {
    //throw std::exception(...);
  }
}

有什么建议吗?请...

Tnx提前&amp;干杯 格雷格

1 个答案:

答案 0 :(得分:0)

我想我在检查了一些教程/示例并仔细阅读文档后解决了这个问题。 首先,io_service.run()调用是阻塞的,直到所有工作完成,并且不再有调度程序。这使得使用事件的信号化变得不必要!

其次,io_service.run()需要在任何第二组或更高版本的调用之前重置! 它现在使用以下代码:

B.MyProperty