Frage Einige Klärung benötigt Boost Asio asynchrone Operationen und Timer


Es gibt einen Aspekt der Timer in asynchronen Verbindungen, die ich wissen möchte, wenn ich richtig verstehe.

Angenommen, wir setzen einen Timer vor dem Ausführen einer Leseoperation, die einen Handler enthält, und dann run() der io_service

Wie ich verstanden habe, endet der io_service, sobald der Manager nach dem Aufruf beendet wird, was aus zwei Gründen geschehen kann:

a) die Leseoperation ist abgeschlossen.

b) der Timer hat seine Grenze erreicht.

Angenommen, die erste (a) Bedingung wurde erreicht, und die Leseoperation wurde beendet, bevor der Zeitgeber beendet ist.

Die Frage ist: Was passiert mit diesem Timer? Müssen wir es beenden? Sagen

dTimer_.expires_from_now (boost::posix_time::seconds(0));

after the io_service.run()?

Können Sie es auf ein neues Intervall zurücksetzen, verwenden Sie das gleiche Timer-Objekt bei Bedarf erneut für eine andere Leseoperation?

Kann ich den io_service zurücksetzen () und das gleiche Objekt in einem neuen Objekt wiederverwenden? run() für diese neue Operation?


5
2018-02-25 10:59


Ursprung


Antworten:


Die Frage ist: Was passiert damit?   Timer? Müssen wir es beenden?

Der Timer-Handler wird weiterhin aufgerufen, wenn Sie dies nicht tun stornieren es

void my_read_handler() {
     dTimer_.cancel(); // remember to catch exceptions
}

Das async_wait handler wird übergeben werden Fehlercode von boost::asio::error::operation_aborted wenn es erfolgreich abgebrochen wurde. Wenn die async_wait abgeschlossen vor dem cancel und der Hundeführer war schon in der Warteschlange io_serviceIhr Handler muss diesen Zustand erkennen und entsprechend reagieren.


Kannst du es auf ein neues Intervall zurücksetzen, wenn   Verwenden Sie das gleiche Timer-Objekt erneut   für eine andere Leseoperation?

Ein deadline_timer kann sein zurücksetzen verwenden expires_from_now

Diese Funktion legt die Ablaufzeit fest.   Alle ausstehenden asynchronen Wartezeiten   Operationen werden abgebrochen. Das   Handler für jede abgebrochene Operation   wird mit dem aufgerufen   boost :: asio :: error :: operation_aborted   Fehlercode.


Kann ich den io_service zurücksetzen () und wiederverwenden?   das gleiche Objekt in einem neuen Lauf () für   diese neue Operation?

Das Gleiche io_service Objekt kann wieder verwendet werden run() oder poll() nach zurücksetzen es.

Diese Funktion muss vorher aufgerufen werden   jede zweite oder spätere Reihe von Aufrufen   der run (), run_one (), poll () oder   poll_one () funktioniert bei einem vorherigen   Aufruf dieser Funktionen zurückgegeben   weil der io_service gestoppt wurde oder   keine Arbeit mehr. Diese Funktion   erlaubt dem io_service, irgendwelche zurückzusetzen   interner Zustand, wie ein "gestoppt"   Flagge.


8
2018-02-25 17:38