Sdílet prostřednictvím


Objekty časovače s možností čekání

Objekt čekacího časovače je synchronizační objekt, jehož stav je nastavený tak, aby signalizoval při doručení zadaného času splnění. Existují dva typy čekačů, které je možné vytvořit: ruční resetování a synchronizace. Časovač libovolného typu může být také periodický časovač.

Objekt Popis
ruční resetování časovače Časovač, jehož stav zůstává signalován, dokud SetWaitableTimer se volá k vytvoření nového termínu splnění.
časovač synchronizace Časovač, jehož stav zůstává signalován, dokud vlákno nekončí operaci čekání na objekt časovače.
periodický časovač Časovač, který se znovu aktivuje při každém vypršení zadaného období, dokud se časovač resetuje nebo nezruší. Periodický časovač je periodický časovač ručního resetování nebo periodický časovač synchronizace.

 

Poznámka

Když je časovač signalován, musí procesor běžet, aby zpracovával přidružené instrukce. Pravidelné časovače s vysokou frekvencí udržují procesor nepřetržitě zaneprázdněný, což brání tomu, aby systém zůstal v nižším stavu napájení po libovolnou smysluplnou dobu. To může mít negativní dopad na životnost přenosných počítačů a scénáře, které závisí na efektivním řízení spotřeby, jako jsou velká datacentra. Pokud chcete větší energetickou efektivitu, zvažte použití oznámení založených na událostech místo oznámení založených na čase ve vaší aplikaci. Pokud je časovač nezbytný, použijte časovač, který je signalován jednou místo pravidelného časovače, nebo nastavte interval na hodnotu větší než jednu sekundu.

 

Vlákno používá CreateWaitableTimer nebo CreateWaitableTimerEx funkce k vytvoření objektu časovače. Vlákno pro vytváření určuje, jestli je časovač ručním resetováním nebo časovač synchronizace. Vlákno pro vytváření může zadat název objektu časovače. Vlákna v jiných procesech mohou otevřít popisovač existujícího časovače zadáním jeho názvu ve volání OpenWaitableTimer funkce. Jakékoli vlákno s popisovačem objektu časovače může použít jednu z čekací funkce čekat, než se stav časovače nastaví na signalizovat.

  • Vlákno volá funkci SetWaitableTimer k aktivaci časovače. Všimněte si použití následujících parametrů pro SetWaitableTimer:
  • Pomocí parametru lpDueTime určete čas, kdy má být časovač nastaven na signalovaný stav. Pokud je časovač ručního resetování nastavený na signalovaný stav, zůstane v tomto stavu, dokud SetWaitableTimer vytvoří novou dobu splnění. Pokud je časovač synchronizace nastavený na signalovaný stav, zůstane v tomto stavu, dokud vlákno dokončí operaci čekání na objekt časovače.
  • K určení období časovače použijte parametr lPeriod funkce SetWaitableTimer. Pokud období není nula, časovač je periodický časovač; se znovu aktivuje pokaždé, když vyprší platnost období, dokud se časovač resetuje nebo nezruší. Pokud je období nula, časovač není periodický časovač; signalizují se jednou a pak se deaktivují.

Vlákno může použít funkci CancelWaitableTimer k nastavení časovače na neaktivní stav. Pokud chcete časovač resetovat, zavolejte SetWaitableTimer. Jakmile dokončíte s objektem časovače, zavolejte CloseHandle zavřít popisovač objektu časovače.

Chování čekaného časovače lze shrnout takto:

  • Pokud je časovač nastavený, zruší se, pokud už byl aktivní, stav časovače není přiřazený a časovač se umístí do fronty časovače jádra.
  • Když vyprší platnost časovače, časovač je nastavený na signalovaný stav. Pokud má časovač rutinu dokončení, zařadí se do fronty do vlákna, které nastaví časovač. Rutina dokončení zůstává ve frontě asynchronního volání procedury (APC) vlákna, dokud vlákno nezadá stav upozornění na čekání. V té době se APC odešle a volá se rutina dokončení. Pokud je časovač pravidelný, umístí se zpět do fronty časovače jádra.
  • Když je časovač zrušen, odebere se z fronty časovače jádra, pokud čeká na vyřízení. Pokud vypršela platnost časovače a stále existuje fronta APC do vlákna, které nastaví časovač, APC se odebere z fronty APC vlákna. Signalovaný stav časovače není ovlivněn.

asynchronní volání procedur

použití objektů čekaného časovače