Udostępnij za pośrednictwem


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.

wywołania procedury asynchronicznej

przy użyciu obiektów czasomierza oczekującego