Informacje o czasomierzach
W tym temacie opisano sposób tworzenia, identyfikowania, ustawiania i usuwania czasomierzy. Aplikacja używa czasomierza do planowania zdarzenia dla okna po upływie określonego czasu. Za każdym razem, gdy określony interwał (lub wartość limitu czasu) dla czasomierza upłynął, system powiadamia okno skojarzone z czasomierzem. Ponieważ dokładność czasomierza zależy od częstotliwości zegara systemowego i częstotliwości pobierania komunikatów z kolejki komunikatów przez aplikację, wartość limitu czasu jest przybliżona.
Ten temat zawiera następujące sekcje.
Operacje czasomierza
Aplikacje tworzą czasomierze przy użyciu funkcji SetTimer. Nowy czasomierz zaczyna odmierzać interwał natychmiast po jego utworzeniu. Aplikacja może zmienić wartość limitu czasu czasomierza przy użyciu SetTimer i może zniszczyć czasomierz przy użyciu funkcji KillTimer. Aby efektywnie korzystać z zasobów systemowych, aplikacje powinny zniszczyć czasomierze, które nie są już niezbędne.
Każdy czasomierz ma unikatowy identyfikator. Podczas tworzenia czasomierza aplikacja może określić identyfikator lub utworzyć unikatową wartość przez system. Pierwszy parametr komunikatu WM_TIMER zawiera identyfikator czasomierza, który opublikował komunikat.
Jeśli w wywołaniu SetTimerokreślisz uchwyt okna, aplikacja skojarzy timer z tym oknem. Za każdym razem, gdy wartość limitu czasu dla czasomierza upłynie, system opublikuje komunikat WM_TIMER w oknie skojarzonym z czasomierzem. Jeśli w wywołaniu SetTimernie określono uchwytu okna, aplikacja, która utworzyła timer, musi monitorować kolejkę komunikatów dla WM_TIMER komunikatów i wysyłać je do odpowiedniego okna.
Notatka
Jeśli określisz opcjonalną funkcję wywołania zwrotnego TIMERPROC, funkcja jest wywoływana podczas pętli komunikatów, a WM_TIMER nie jest wysyłany do wywołania zwrotnego WNDPROC.
Jeśli musisz otrzymywać powiadomienia o upływie czasomierza, użyj czasomierza z możliwością oczekiwania. Aby uzyskać więcej informacji, zobacz Obiekty zegarów oczekujących (Waitable Timer Objects).
Czasomierz o wysokiej rozdzielczości
Licznik to ogólny termin używany w programowaniu do odwoływania się do zmiennej przyrostowej. Niektóre systemy obejmują licznik wydajności o wysokiej rozdzielczości, który zapewnia precyzyjne czasy upłynięcia.
Jeśli w systemie istnieje licznik wydajności o wysokiej rozdzielczości, możesz użyć funkcji QueryPerformanceFrequency, aby wyrazić częstotliwość, w liczbach na sekundę. Wartość liczby jest zależna od procesora. Na przykład w niektórych procesorach liczba może być częstotliwością cyklu zegara procesora.
Funkcja QueryPerformanceCounter pobiera bieżącą wartość licznika wydajności o wysokiej rozdzielczości. Wywołując tę funkcję na początku i na końcu sekcji kodu, aplikacja zasadniczo używa licznika jako czasomierza o wysokiej rozdzielczości. Załóżmy na przykład, że QueryPerformanceFrequency wskazuje, że częstotliwość licznika wydajności o wysokiej rozdzielczości wynosi 50 000 liczników na sekundę. Jeśli aplikacja wywołuje QueryPerformanceCounter bezpośrednio przed i bezpośrednio po sekcji kodu, której czas ma być mierzony, wartości licznika mogą wynosić odpowiednio 1500 i 3500. Te wartości wskazują, że 0,04 sekundy (2000 zliczeń) upłynęły podczas wykonywania kodu.
Obiekty czekającego czasomierza
Obiekt czasomierza oczekiwania to obiekt synchronizacji, którego stan jest ustawiony na sygnalizowany 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.
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ą uzyskać dostęp 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 korzystać z jednej z funkcji oczekiwania, aby poczekać na ustawienie stanu czasomierza na zasygnalizowany.
Aby uzyskać więcej informacji na temat używania obiektów czasomierza do oczekiwania na potrzeby synchronizacji wątków, zobacz Waitable Timer Objects.
Tematy pokrewne
- używanie czasomierzy