Dela via


Tidsinställt tidsinställt objekt

Ett väntebart timerobjekt är ett synkroniseringsobjekt vars tillstånd är inställt på signal när den angivna förfallotiden kommer. Det finns två typer av väntetidstimers som kan skapas: manuell återställning och synkronisering. En timer av båda typerna kan också vara en periodisk timer.

Objekt Beskrivning
timer för manuell återställning En timer vars tillstånd förblir signalerat tills SetWaitableTimer anropas för att upprätta en ny förfalltid.
synkroniseringstimer En timer vars tillstånd förblir signalerat tills en tråd slutför en vänteåtgärd på timerobjektet.
periodisk timer En timer som återaktiveras varje gång den angivna perioden upphör att gälla tills timern återställs eller avbryts. En periodisk timer är antingen en periodisk timer för manuell återställning eller en periodisk synkroniseringstimer.

 

Not

När en timer signaleras måste processorn köras för att bearbeta de associerade instruktionerna. Periodiska högfrekventa timers håller processorn ständigt upptagen, vilket förhindrar att systemet förblir i ett lägre strömtillstånd under någon meningsfull tid. Detta kan ha en negativ inverkan på bärbar dators batteritid och scenarier som är beroende av effektiv energisparfunktioner, till exempel stora datacenter. För större energieffektivitet bör du överväga att använda händelsebaserade meddelanden i stället för tidsbaserade meddelanden i ditt program. Om en timer är nödvändig använder du en timer som signaleras en gång i stället för en periodisk timer eller anger intervallet till ett värde som är större än en sekund.

 

En tråd använder funktionen CreateWaitableTimer eller CreateWaitableTimerEx för att skapa ett tidsinställt objekt. Den skapande tråden anger om timern är en timer för manuell återställning eller en synkroniseringstimer. Den skapande tråden kan ange ett namn för det tidsinställda objektet. Trådar i andra processer kan öppna ett handtag till en befintlig timer genom att ange dess namn i ett anrop till funktionen OpenWaitableTimer. Alla trådar med ett handtag till ett tidsinställt objekt kan använda någon av de väntefunktionerna för att vänta tills timertillståndet har angetts till signalerat.

  • Tråden anropar funktionen SetWaitableTimer för att aktivera timern. Observera användningen av följande parametrar för SetWaitableTimer:
  • Använd parametern lpDueTime för att ange tidpunkten då timern ska anges till det signalerade tillståndet. När en timer för manuell återställning är inställd på det signalerade tillståndet förblir den i det här tillståndet tills SetWaitableTimer upprättar en ny förfalltid. När en synkroniseringstimer är inställd på det signalerade tillståndet förblir den i det här tillståndet tills en tråd slutför en vänteåtgärd på timerobjektet.
  • Använd parametern lPeriod för funktionen SetWaitableTimer för att ange tidsperioden. Om perioden inte är noll är timern en periodisk timer. den återaktiveras varje gång perioden går ut, tills timern återställs eller avbryts. Om perioden är noll är timern inte en periodisk timer. den signaleras en gång och sedan inaktiveras.

En tråd kan använda funktionen CancelWaitableTimer för att ange timern till det inaktiva tillståndet. Om du vill återställa timern anropar du SetWaitableTimer. När du är klar med det tidsinställda objektet anropar du CloseHandle för att stänga handtaget till det tidsinställda objektet.

Beteendet för en väntetidstimer kan sammanfattas på följande sätt:

  • När en timer har angetts avbryts den om den redan var aktiv, timerns tillstånd är icke-signalerat och timern placeras i kernel-timerkön.
  • När en timer upphör att gälla är timern inställd på det signalerade tillståndet. Om timern har en slutföranderutin placeras den i kö till tråden som anger timern. Slutföranderutinen finns kvar i asynkrona proceduranropet (APC) kön för tråden tills tråden har ett aviseringsbart väntetillstånd. Vid den tidpunkten skickas APC och slutföranderutinen anropas. Om timern är periodisk placeras den tillbaka i kernel-timerkön.
  • När en timer avbryts tas den bort från kernel-timerkön om den var väntande. Om timern hade upphört att gälla och det fortfarande finns en APC i kö till tråden som anger timern tas APC bort från trådens APC-kö. Timerns signaltillstånd påverkas inte.

Asynkrona proceduranrop

Använda väntebara timerobjekt