Obiekty czasomierza oczekiwania
Obiekt czasomierza oczekiwania jest obiektem synchronizacji, którego stan jest ustawiony na sygnał po upływie określonego czasu. Istnieją dwa typy czasomierzy oczekiwania, które można utworzyć: ręczne resetowanie i synchronizacja. Czasomierz dowolnego typu może być również okresowym czasomierzem.
Sprzeciwiać się | Opis |
---|---|
czasomierz resetowania ręcznego | Czasomierz, którego stan pozostaje zasygnalizowany do czasu SetWaitableTimer jest wywoływany w celu ustanowienia nowego czasu. |
czasomierz synchronizacji | Czasomierz, którego stan pozostaje zasygnalizowany, aż wątek zakończy operację oczekiwania na obiekcie czasomierza. |
czasomierz okresowy | Czasomierz, który jest ponownie uaktywniany za każdym razem, gdy określony okres wygaśnie, dopóki czasomierz nie zostanie zresetowany lub anulowany. Czasomierz okresowy to okresowy czasomierz resetowania ręcznego lub czasomierz okresowej synchronizacji. |
Nuta
Gdy czasomierz jest zasygnalizowany, procesor musi działać w celu przetworzenia skojarzonych instrukcji. Czasomierze okresowe o wysokiej częstotliwości utrzymują stały ruch procesora, co uniemożliwia systemowi pozostawanie w niższym stanie zasilania przez jakikolwiek znaczący czas. Może to mieć negatywny wpływ na żywotność baterii komputera przenośnego i scenariusze, które zależą od efektywnego zarządzania energią, takich jak duże centra danych. Aby zwiększyć efektywność energetyczną, rozważ użycie powiadomień opartych na zdarzeniach zamiast powiadomień opartych na czasie w aplikacji. Jeśli czasomierz jest konieczny, użyj czasomierza, który jest zasygnalizowany raz, a nie czasomierz okresowy, lub ustaw interwał na wartość większą niż jedną sekundę.
Wątek używa createWaitableTimer lub funkcji CreateWaitableTimerEx w celu utworzenia obiektu czasomierza. Wątek tworzenia określa, czy czasomierz jest czasomierzem resetowania ręcznego, czy czasomierzem synchronizacji. Wątek tworzący może określać nazwę obiektu czasomierza. Wątki w innych procesach mogą otwierać dojście do istniejącego czasomierza, określając jego nazwę w wywołaniu funkcji OpenWaitableTimer. Każdy wątek z uchwytem do obiektu czasomierza może używać jednej z funkcji oczekiwania czekać na stan czasomierza, który ma być ustawiony na sygnalizowany.
- Wątek wywołuje funkcję SetWaitableTimer, aby aktywować czasomierz. Zwróć uwagę na użycie następujących parametrów dla SetWaitableTimer:
- Użyj parametru lpDueTime, aby określić czas, w którym czasomierz ma być ustawiony na stan sygnału. Gdy czasomierz resetowania ręcznego jest ustawiony na stan zasygnalizowany, pozostaje w tym stanie do czasu SetWaitableTimer ustanawia nowy termin. Gdy czasomierz synchronizacji jest ustawiony na stan zasygnalizowany, pozostaje w tym stanie, dopóki wątek nie zakończy operacji oczekiwania na obiekcie czasomierza.
- Użyj parametru lPeriod funkcji SetWaitableTimer, aby określić okres czasomierza. Jeśli okres nie jest równy zero, czasomierz jest okresowym czasomierzem; jest ponownie uaktywniany za każdym razem, gdy okres wygaśnie, dopóki czasomierz nie zostanie zresetowany lub anulowany. Jeśli okres wynosi zero, czasomierz nie jest okresowym czasomierzem; jest ona sygnalizowana raz, a następnie dezaktywowana.
Wątek może używać funkcji CancelWaitableTimer, aby ustawić czasomierz na stan nieaktywny. Aby zresetować czasomierz, wywołaj SetWaitableTimer. Po zakończeniu pracy z obiektem czasomierza wywołaj metodę CloseHandle, aby zamknąć uchwyt do obiektu czasomierza.
Zachowanie czasomierza do oczekiwania można podsumować w następujący sposób:
- Po ustawieniu czasomierza jest on anulowany, jeśli był już aktywny, stan czasomierza jest niepodpisany, a czasomierz jest umieszczany w kolejce czasomierza jądra.
- Po wygaśnięciu czasomierza czasomierz jest ustawiony na stan sygnału. Jeśli czasomierz ma procedurę uzupełniania, jest on kolejkowany do wątku, który ustawia czasomierz. Procedura uzupełniania pozostaje w asynchronicznej procedury wywołania (APC) kolejki wątku do momentu, aż wątek wejdzie w stan oczekiwania z możliwością alertu. W tym czasie jest wysyłany APC i wywoływana jest rutyna ukończenia. Jeśli czasomierz jest okresowy, zostanie umieszczony z powrotem w kolejce czasomierza jądra.
- Po anulowaniu czasomierza zostanie on usunięty z kolejki czasomierza jądra, jeśli oczekuje. Jeśli czasomierz wygasł i nadal istnieje kolejka APC do wątku, który ustawi czasomierz, APC jest usuwany z kolejki APC wątku. Nie ma to wpływu na stan sygnalizatora czasomierza.
Tematy pokrewne