2017-02-27 13 views
2

Ich benutze diesen Code async_read_some mit TimeoutBoost Asio async_read_some Timeout

 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); 

hier sind meine Rückrufe

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

mein Problem ist, dass timeoutHandler wird sofort ausgeführt wird und nicht nach 5 Sekunden

+0

Es ist eine Weile her, seit ich Asio verwendet habe, aber was passiert, wenn Sie die 'io.reset()' entfernen? Es kann dazu führen, dass der 'async_wait' zurückgesetzt wird –

+0

Wie @SteveVanOpstal sagte, sollten Sie das' io.reset() 'entfernen. Sie fügen dem asynchronen Ereignishandler (io_service) Aufgaben hinzu und setzen ihn dann unmittelbar vor dem Ausführen des Dienstes zurück, der die von Ihnen hinzugefügten Ereignisse ausführt (was Sie mit 'run_one()' tun). Ich empfehle, dass Sie mehr über 'io_service' lesen und lernen und wie es funktioniert. –

+0

danke, ich habe das versucht, aber mit dem gleichen Ergebnis wird 'timeoutHandler()' sofort aufgerufen – user2071938

Antwort

1

Einfacher Fehler. Sie sollten expires_from_now vor dem Aufruf async_wait tun.

#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; 
} 
Verwandte Themen