Delen via


Wachtbare timerobjecten

Een wachtbaar timerobject is een synchronisatieobject waarvan de status is ingesteld op gesignaleerd wanneer de opgegeven einddatum binnenkomt. Er zijn twee soorten wachtbare timers die kunnen worden gemaakt: handmatig opnieuw instellen en synchroniseren. Een timer van beide typen kan ook een periodieke timer zijn.

Object Beschrijving
timer handmatig opnieuw instellen Een timer waarvan de status wordt aangegeven totdat SetWaitableTimer- wordt aangeroepen om een nieuwe einddatum tot stand te brengen.
synchronisatietimer Een timer waarvan de status wordt gesignaleerd totdat een thread een wachtbewerking op het timerobject heeft voltooid.
periodieke timer Een timer die telkens opnieuw wordt geactiveerd wanneer de opgegeven periode verloopt, totdat de timer opnieuw wordt ingesteld of geannuleerd. Een periodieke timer is een periodieke timer voor handmatig opnieuw instellen of een periodieke synchronisatietimer.

 

Notitie

Wanneer een timer wordt gesignaleerd, moet de processor worden uitgevoerd om de bijbehorende instructies te verwerken. Periodieke timers met een hoge frequentie houden de processor voortdurend bezet, waardoor het systeem gedurende een zinvolle hoeveelheid tijd in een lagere energiestatus blijft. Dit kan een negatieve invloed hebben op de levensduur van de batterij van draagbare computers en scenario's die afhankelijk zijn van effectief energiebeheer, zoals grote datacenters. Voor een grotere energie-efficiëntie kunt u op gebeurtenissen gebaseerde meldingen gebruiken in plaats van op tijd gebaseerde meldingen in uw toepassing. Als een timer nodig is, gebruikt u een timer die eenmaal wordt gesignaleerd in plaats van een periodieke timer, of stelt u het interval in op een waarde die groter is dan één seconde.

 

Een thread maakt gebruik van de functie CreateWaitableTimer of CreateWaitableTimerEx functie om een timerobject te maken. De thread die wordt gemaakt, geeft aan of de timer een timer voor handmatig opnieuw instellen of een synchronisatietimer is. De thread die wordt gemaakt, kan een naam voor het timerobject opgeven. Threads in andere processen kunnen een ingang openen voor een bestaande timer door de naam ervan op te geven in een aanroep naar de OpenWaitableTimer-functie. Elke thread met een greep naar een timerobject kan een van de wachtfuncties gebruiken te wachten totdat de timerstatus is ingesteld op gesignaleerd.

  • De thread roept de SetWaitableTimer--functie aan om de timer te activeren. Let op het gebruik van de volgende parameters voor SetWaitableTimer-:
  • Gebruik de parameter lpDueTime om het tijdstip op te geven waarop de timer moet worden ingesteld op de gesignaleerde status. Wanneer een timer voor handmatig opnieuw instellen is ingesteld op de gesignaleerde status, blijft deze in deze status totdat SetWaitableTimer een nieuwe einddatum tot stand brengt. Wanneer een synchronisatietimer is ingesteld op de gesignaleerde status, blijft deze status behouden totdat een thread een wachtbewerking op het timerobject heeft voltooid.
  • Gebruik de parameter lPeriod van de functie SetWaitableTimer om de timerperiode op te geven. Als de periode niet nul is, is de timer een periodieke timer; deze wordt telkens opnieuw geactiveerd wanneer de periode verloopt, totdat de timer opnieuw wordt ingesteld of geannuleerd. Als de periode nul is, is de timer geen periodieke timer; het wordt eenmaal gesignaleerd en vervolgens gedeactiveerd.

Een thread kan de functie CancelWaitableTimer gebruiken om de timer in te stellen op de inactieve status. Als u de timer opnieuw wilt instellen, roept u SetWaitableTimer-aan. Wanneer u klaar bent met het timerobject, roept u CloseHandle- aan om de greep te sluiten bij het timerobject.

Het gedrag van een wachttijdtimer kan als volgt worden samengevat:

  • Wanneer een timer is ingesteld, wordt deze geannuleerd als deze al actief was, wordt de status van de timer niet-ondertekend en wordt de timer in de kerneltimerwachtrij geplaatst.
  • Wanneer een timer verloopt, wordt de timer ingesteld op de gesignaleerde status. Als de timer een voltooiingsroutine heeft, wordt deze in de wachtrij geplaatst bij de thread waarmee de timer is ingesteld. De voltooiingsroutine blijft in de asynchrone procedureaanroep (APC) wachtrij van de thread totdat de thread een waarschuwingsstatus invoert. Op dat moment wordt de APC verzonden en wordt de voltooiingsroutine aangeroepen. Als de timer periodiek is, wordt deze weer in de kerneltimerwachtrij geplaatst.
  • Wanneer een timer wordt geannuleerd, wordt deze verwijderd uit de kerneltimerwachtrij als deze in behandeling was. Als de timer is verlopen en er nog steeds een APC in de wachtrij staat voor de thread waarmee de timer is ingesteld, wordt de APC verwijderd uit de APC-wachtrij van de thread. De gesignaleerde status van de timer wordt niet beïnvloed.

asynchrone procedureaanroepen

gebruik maken van wachtbare timerobjecten