Mam TTimer w mojej aplikacji, który uruchamia się co 2 sekundy i wywołuje moją obsługę zdarzenia, HandleTimerEvent(). Funkcja HandleTimerEvent() modyfikuje udostępnione zasoby i może upłynąć 10 sekund sekundy przed wykonaniem polecenia. Ponadto wywołuję funkcję Sleep() w procedurze obsługi zdarzeń, aby czasami zrezygnować z procesora.Czy program obsługi zdarzeń TTimer.OnTimer jest ponownie wyświetlany?
Nie jestem pewien, jak działa TTimer obiektu budującego C++, jeśli chodzi o wywoływanie zdarzeń, więc scenariusz, który właśnie wyjaśniłem, skłonił mnie do zastanowienia się, w szczególności, czy HandleTimerEvent() zostanie wywołany przed powrotem poprzedniego połączenia.
Pytanie sprowadza się do kilku rzeczy.
Czy obiekt TTimer umieszcza w kolejce zdarzenia?
Czy obiekt TTimer może wywoływać moją funkcję obsługi zdarzenia przed zwróceniem poprzedniego połączenia?
+1 za wyłączenie timera. Aby zademonstrować skuteczność wyłączenia timera (lub łatwego pokazania, co może pójść nie tak, jeśli tego nie zrobisz), wyświetl komunikat w module obsługi zegara. Jeśli nie wyłączysz timera po wejściu, skrzynki komunikacyjne będą się układać w stosy. –
Można również użyć flagi binarnej, aby zapobiec ponownemu umieszczeniu w sterowniku zdarzeń zegara, ale wyłączenie samego zegara jest znacznie prostsze. – dthorpe
Zobacz https://forums.embarcadero.com/thread.jspa?messageID=171751𩻧 dla użytecznej klasy TTimerGuard, klasy w stylu RAII do używania TTimer. Może wymagać dostosowania użycia FInterval w zależności od implementacji. –