2017-02-27 1 views
2

J'utilise ce code à l'aide async_read_some avec délaiboost délai ASIO async_read_some

 readdata=0; 
     port_->async_read_some(boost::asio::buffer(vector), 
       boost::bind(readCallback)); 


     //init async timer 
     boost::asio::deadline_timer timer(io); 
     timer.async_wait(boost::bind(timeoutHandler)); 
     timer.expires_from_now(boost::posix_time::seconds(5)); 

     io.reset(); 
     do { 
      io.run_one(); 
     } 
     while (readdata==0); 

ici sont mes callbacks

void readCallback() 
{ 
    std::cout << "READ CALLBACK: "<<x<<std::endl; 
    readdata=1; 
    return; 
} 
void timeoutHandler() 
{ 
    std::cout << "TIMEOUT CALLBACK: "<<x<<std::endl; 
    readdata=1; 
} 

mon problème est que timeoutHandler est est exécutée instantanément et non au bout de 5 secondes

+0

Il y a longtemps que j'ai utilisé asio mais que se passe-t-il lorsque vous supprimez 'io.reset()'? Cela peut entraîner la réinitialisation de 'async_wait' –

+0

Comme dit @SteveVanOpstal, vous devriez supprimer' io.reset() '. Vous ajoutez des tâches au gestionnaire d'événement async (io_service), puis vous le réinitialisez immédiatement avant d'exécuter le service qui exécutera les événements que vous avez ajoutés (ce que vous faites avec 'run_one()'). Je vous recommande de lire et d'en apprendre plus sur 'io_service' et comment cela fonctionne. –

+0

merci, j'ai essayé, mais avec le même résultat, 'timeoutHandler()' est appelé instantanément – user2071938

Répondre

1

Erreur simple. Vous devriez faire expires_from_now avant d'appeler async_wait.

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

int main() { 
    asio::io_service io_s; 
    asio::deadline_timer timer(io_s); 
    timer.expires_from_now(boost::posix_time::seconds(5)); 
    timer.async_wait([](auto err_c) { std::cout << "After 5 seconds" << std::endl; }); 

    io_s.reset(); 

    io_s.run(); 

    return 0; 
}