Es gibt eine Zeile im dritten Tutorial auf Boost asio, die zeigt, wie man einen Timer erneuert und trotzdem verhindert, dass es driftet. Die Linie ist die folgende:Benötigen Sie eine Erklärung für diesen Boost :: asio timer example
t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
es ist mir Vielleicht, aber ich war nicht in der Lage Dokumentation auf der 2. Nutzung von E xpires_at()
, ohne Parameter zu finden. expires_at(x)
legt das neue Ablaufdatum fest und löscht alle ausstehenden Abschlussbehandlungsroutinen. Also vermutlich expires_at() was tut, Rückgabezeitpunkt des letzten Ablaufs? Also, durch Hinzufügen einer Sekunde, wenn es eine gewisse Anzahl von ms geben sollte, zum Beispiel n ms, dann wird es im Wesentlichen vom nächsten Ablauf "subtrahiert", da die Zeit berücksichtigt wird? Was passiert dann, wenn die Zeit für die Ausführung dieses Handlers in diesem Beispiel länger als 1 Sekunde ist? Feuert es sofort?
Nicht sicher, verstehe ich Ihren ersten Satz. expires_at() gibt eine posix-Zeit zurück (in diesem Fall posix). aber in dieser Codezeile wird es * innerhalb * des Completion-Handlers ausgeführt, so dass das Ablaufdatum in der Vergangenheit liegt (gerade vor einem Split-Moment passiert). Wenn ich also den Effekt verstehe, dass du Zeit in der Vergangenheit mit 1 Sekunde addierst, verrechne dadurch die Zeit, die du nimmst * jetzt *, um den Vervollständigungshandler zu machen (welcher Code auch immer dieser Zeile voranging). So wird Drift vermieden, oder? Sonst addierst du 1 Sekunde + die Zeit, die benötigt wurde, um den Code vor dieser Zeile auszuführen? – ApplePieIsGood
Dies wird 1 Sekunde zu dem Zeitpunkt hinzufügen, an dem der Handler aufgerufen werden sollte. Wenn Sie aus irgendeinem Grund eine Verzögerung haben, bevor Sie in den Handler kommen, ist es weniger als eine Sekunde, bevor der Handler erneut aufgerufen wird. Oder im speziellen Fall wird es nur in die Warteschlange gestellt, weil es bereits behandelt worden sein sollte, weil es zu lange dauerte, um diesen Code zu erreichen. Wenn Sie denken, dass es ein großes Risiko ist, dass 1s zu klein ist, sollten Sie vielleicht expires_from_now (x) verwenden, um stattdessen 1s zu setzen. – jpyllman