我正在使用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;干杯 格雷格
答案 0 :(得分:0)
我想我在检查了一些教程/示例并仔细阅读文档后解决了这个问题。 首先,io_service.run()调用是阻塞的,直到所有工作完成,并且不再有调度程序。这使得使用事件的信号化变得不必要!
其次,io_service.run()需要在任何第二组或更高版本的调用之前重置! 它现在使用以下代码:
B.MyProperty