2009-12-17 18 views
6

Ich bin nach einem besseren Beispiel der boost::asio::deadline_timerBessere Boost Asio deadline_timer Beispiel

die gegebenen Beispiele werden immer aus der Zeit und rufen Sie die close Methode. Ich habe versucht, cancel() auf einen Timer zu nennen, aber das bewirkt, dass die in async_wait übergebene Funktion sofort aufgerufen wird.

Was ist die richtige Art mit Timer in einem asynchronen TCP-Client zu arbeiten?

+1

gibt es Gründe für dieses Verhalten. Jeder Aufruf von async_wait wird mit einem Beendigungshandler gepaart. Calling Cancel bewirkt dies nicht. –

Antwort

20

Sie erwähnen, dass das Aufrufen von cancel() für einen Timer bewirkt, dass die an async_wait übergebene Funktion sofort aufgerufen wird. Dies ist das erwartete Verhalten. Denken Sie jedoch daran, dass Sie den Fehler überprüfen können, der an den Zeitgeber übergeben wurde, um festzustellen, ob der Zeitgeber abgebrochen wurde. Wenn der Timer abgebrochen wurde, wird operation_aborted übergeben. Zum Beispiel:

void handleTimer(const boost::system::error_code& error) { 
    if (error == boost::asio::error::operation_aborted) { 
     std::cout << "Timer was canceled" << std::endl; 
    } 
    else if (error) { 
     std::cout << "Timer error: " << error.message() << std::endl; 
    } 
} 

Hoffentlich hilft dies. Wenn nicht, nach welchem ​​konkreten Beispiel suchen Sie?

+0

Schaltet io_service.stop() den Timer ab? –

Verwandte Themen