2010-03-20 14 views
5

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?

Odpowiedz

2

expires_at() zwraca czas, gdy jest ustawiony na timeout. To spowoduje przesunięcie limitu czasu do 1 sekundy później.

Po ustawieniu czasu na expires_at (x) otrzymasz zwrot 0, jeśli jest już wywołany z powodu upływu czasu. Jeśli zwrot jest większy niż 0, wskazuje liczbę wykonanych anulowań.

+0

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

+0

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

Powiązane problemy