Как отличить отмененный таймер от повторного _срока повышения

Когда вы вызываете expires_from_now()во время работы таймера, таймер отменяется и вызывается новый таймер. Так вызывается связанный обработчик. Легко различать в обработчике между отмененным и истекшим таймером. Тем не менее, мне интересно, есть ли способ различать между истекшим и перезапущенным таймером. В обоих случаях вызывается обработчик с кодом ошибки _operation_aborted. Или, может быть, я упустил некоторые детали.

Приведенный ниже код генерирует следующий вывод:

20120415 21:32:28079507 Main: Timer1 set to 15 s.    
20120415 21:32:28079798 Main: Timer1 set to 12 s.    
20120415 21:32:28079916 Handler1: Timer 1 was cancelled or retriggered.    
20120415 21:32:40079860 Handler1: expired.

Это говорит о том, что обработчик не может реализовать действия для отмененного обработчика, потому что повторный запуск таймера вызовет тот же обработчик и тем самым выполнит те же действия. Что, вероятно, не является предполагаемым поведением.

#include <boost/asio.hpp> 
#include <boost/thread.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
#include <iostream> 

using namespace boost::posix_time;
using namespace std;

void handler1(const boost::system::error_code &ec) 
{ 
    if (ec == boost::asio::error::operation_aborted)
    {
        cout << microsec_clock::local_time() << " Handler1: Timer was cancelled or retriggered." << endl; 
    }
    else
    {
        cout << microsec_clock::local_time() << " Handler1: Timer expired." << endl; 
    }
} 

boost::asio::io_service io_service1; 

void run1() 
{ 
    io_service1.run(); 
} 

int main() 
{ 
    time_facet *facet = new time_facet("%Y%m%d %H:%M:%S%f");
    cout.imbue(locale(cout.getloc(), facet));

    boost::asio::deadline_timer timer1(io_service1, seconds(15)); 
    timer1.async_wait(handler1); 
    cout << microsec_clock::local_time() << " Main: Timer1 set to 15 s." << endl; 
    // now actually run the timer
    boost::thread thread1(run1); 
    timer1.expires_from_now(seconds(12));
    cout << microsec_clock::local_time() << " Main: Timer1 set to 12 s." << endl; 
    // here the timer is running, but we need to reset the deadline
    timer1.async_wait(handler1); 
    thread1.join();   // wait for thread1 to terminate 
} 
6
задан Rafał Rawicki 15 April 2012 в 19:51
поделиться