2011-01-04 12 views

Odpowiedz

7

Program obsługi limitu czasu zostanie wywołany z warunkiem błędu, jeśli timer został anulowany (jak również z normalnym czasem oczekiwania). Czy nie można po prostu ustawić wartości logicznej przed wywołaniem async_wait, a następnie zresetować ją w module obsługi, jeśli ustawiony jest warunek błędu?

+0

tak, po prostu sprawdzenie, czy nie zostały pominięte coś w interfejsie deadline_timer –

2

trzy opcje przychodzą na myśl:

  1. Stwórz własną klasę timera (przy użyciu deadline_timer oczywiście), który ma swój własny element do_async_wait. W tym elemencie ustawiasz zmienną składową, która może następnie zostać zwrócona z elementu bool isWaiting() lub podobnego, zanim wywołasz async_wait w wewnętrznym deadline_timer. Zauważ, że nie uważam, że członek async_wait jest wirtualny, więc nie możesz po prostu dziedziczyć z deadline_timer i przesłonić. Zauważ, że powinieneś również zresetować flagę, gdy wywoływany jest twój handler (wykonując własny timer, który przekazuje dalej do dowolnego innego handler'a) lub gdy wywoływany jest call.

  2. Edytuj kod doładowania, aby zrobić to, co chcesz. Jest to całkowicie zgodne z prawem, o ile mi wiadomo, jednak nie jest to oczywiście bardzo dobra opcja.

  3. Zmień swoje wymagania/projekt, abyś nie musiał o tym wiedzieć.

2

Co powiesz na to?

boost::asio::deadline_timer mTimer; 
const bool timerExpired = (mTimer.expires_at() 
    <= boost::posix_time::second_clock::local_time()); 
+0

to nie będzie działać, ponieważ zegar nie jest gwarantowana wygasa dokładnie na czas. –

+0

Jak to się różni od innych zegarów? –

+0

Nie różni się od innych zegarów. Ale jeśli użyjesz tego kodu do wykrycia, czy timer jest aktywny, istnieje warunek wyścigowy, w którym to będzie zwracane przez małą przerwę przed upływem czasu. Jeśli używasz tego, na przykład, aby sprawdzić, czy można bezpiecznie zwolnić pamięć, program ulegnie awarii. –

0

wiem, że to jest trochę stary w tym momencie, ale mam inny możliwy sugestia: jak o uzyskanie wdrożenie, a następnie żądania, jeśli nie są możliwe do czasu czeka. to będzie wyglądać następująco:

mTimer.get_implementation().might_have_pending_waits 
Powiązane problemy