W trzecim samouczku na temat Boost asio znajduje się wiersz, który pokazuje, jak odnowić timer, a jednocześnie zapobiec dryfowaniu. Linia jest następujący:Potrzebuję wyjaśnienia dla tego boost :: przykład asio timera
t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
Może to ja, ale nie byłem w stanie znaleźć dokumentację na 2 wykorzystania e xpires_at()
, bez żadnych parametrów. expires_at(x)
ustala nowe wygasanie, anulowanie wszelkich oczekujących programów obsługi zakończenia. Tak przypuszczalnie expires_at() robi co, zwróci czas ostatniego wygaśnięcia? Więc dodając jedną sekundę, jeśli powinna być pewna liczba ms, powiedzmy n ms, to w istocie będzie ona w istocie "odjęta" od następnej daty wygaśnięcia, ponieważ czas jest rozliczany? Co się stanie, jeśli czas potrzebny na wykonanie tego programu obsługi jest większy niż 1 sekunda w tym przykładzie? Czy strzela natychmiast?
Nie jestem pewien, czy rozumiem twoje pierwsze zdanie. expires_at() zwraca czas posika (w tym przypadku posix). ale w tym wierszu kodu jest wykonywany * wewnątrz * programu obsługi zakończenia, więc wygaśnięcie jest w przeszłości (właśnie stało się przed chwilą). Więc jeśli rozumiem, że efekt polega na tym, że dodajesz czas w przeszłości przez 1 sekundę, tym samym biorąc pod uwagę czas, w którym bierzesz * teraz *, aby wykonać procedurę obsługi zakończenia (jakikolwiek kod poprzedzał tę linię). W ten sposób unikasz dryfu, prawda? W przeciwnym razie dodajesz 1 sekundę + czas potrzebny na wykonanie kodu poprzedzającego ten wiersz? – ApplePieIsGood
Spowoduje to dodanie 1 sekundy do czasu, w którym miało nastąpić wywołanie programu obsługi. Więc jeśli masz jakieś opóźnienie z jakiegoś powodu przed wejściem do obsługi, to jest to mniej niż jedną sekundę, zanim ponownie uruchomi się przewodnik. Lub w specjalnym przypadku po prostu umieści go w kolejce, ponieważ powinno było już być obsługiwane, ponieważ długo trwało osiągnięcie tego kodu. Jeśli uważasz, że jest to duże ryzyko, to dla małego powinieneś użyć zamiast tego expires_from_now (x), aby ustawić 1s od teraz. – jpyllman