See the #if below. I'm pretty sure these should do the same thing. The expires_from_now() version does what I'd expect and calls onTimer() once a second.
The expires_at() version never calls onTimer(). Even though 'expires_at() const' returns 1s from now:
doit now =2010-May-21 15:07:24.882854
expires_at =2010-May-21 15:07:25.882854
<and nothing more>
//*********************************************************************************
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>
using std::cout;
using namespace boost::asio;
using namespace boost::posix_time;
io_service ioService;
deadline_timer timer(ioService);
seconds s1(1);
void doit();
void onTimer(const boost::system::error_code&){
doit(); //repeat forever
}
void doit(){
ptime now=microsec_clock::local_time();
cout<< "doit now ="<< now <<std::endl;
#if 0
timer.expires_from_now(s1); //works
#else
timer.expires_at( now+s1); //doesn't work
#endif
timer.async_wait( onTimer );
cout<< "expires_at ="<< timer.expires_at()<< std::endl ;
}
void timerTest(){
doit();
io_service::work w(ioService);
ioService.run();
}
int main(){
timerTest();
return 0;
}