Sdílet prostřednictvím


Wait Functions

funkce čekání umožňují vláknu blokovat vlastní spuštění. Funkce čekání se nevrací, dokud nebudou splněna zadaná kritéria. Typ funkce čekání určuje sadu použitých kritérií. Při zavolání funkce čekání zkontroluje, jestli byla splněna kritéria čekání. Pokud kritéria nebyla splněna, volající vlákno zadá stav čekání, dokud nebudou splněny podmínky kritérií čekání, nebo uplynutí zadaného intervalu časového limitu.

Funkce čekání na jeden objekt

Funkce SignalObjectAndWait, WaitForSingleObjecta WaitForSingleObjectEx vyžadují popisovač jednoho synchronizačního objektu. Tyto funkce se vrátí, když nastane jedna z následujících situací:

  • Zadaný objekt je v signalovaném stavu.
  • Časový limit vyprší. Interval časového limitu lze nastavit na INFINITE určit, že čekání nevyjde.

Funkce SignalObjectAndWait umožňuje volajícímu vláknu atomicky nastavit stav objektu tak, aby signalizoval a čekal na nastavení stavu jiného objektu.

Funkce čekání na více objektů

WaitForMultipleObjects, WaitForMultipleObjectsEx, MsgWaitForMultipleObjectsa MsgWaitForMultipleObjectsEx funkce umožňují volající vlákno určit pole obsahující jeden nebo více popisovačů objektu synchronizace. Tyto funkce se vrátí, když nastane jedna z následujících situací:

  • Stav některého ze zadaných objektů je nastaven na signál nebo stavy všech objektů byly nastaveny na signalizovány. Určujete, jestli se ve volání funkce použije jeden nebo všechny stavy.
  • Časový limit vyprší. Interval časového limitu lze nastavit na INFINITE určit, že čekání nevyjde.

Funkce MsgWaitForMultipleObjects a MsgWaitForMultipleObjectsEx umožňuje zadat vstupní objekty události v poli popisovače objektu. To se provede, když zadáte typ vstupu, na který se má čekat ve vstupní frontě vlákna. Vlákno může například použít MsgWaitForMultipleObjects blokovat jeho provádění, dokud není stav zadaného objektu nastaven na signál a vstup myši je k dispozici ve vstupní frontě vlákna. Vlákno může k načtení vstupu použít funkci GetMessage nebo PeekMessageA nebo PeekMessage W.

Při čekání na stavy všech objektů, které mají být nastaveny na signál, tyto funkce s více objekty nemění stavy zadaných objektů, dokud nebudou stavy všech objektů signalizovány. Například stav objektu mutex lze signalizovat, ale volající vlákno nezískne vlastnictví, dokud nejsou stavy ostatních objektů zadané v poli také nastaveny na signál. Mezitím může některé jiné vlákno získat vlastnictví objektu mutex a tím nastavit jeho stav na nepřiřazené.

Při čekání na nastavení stavu jednoho objektu signalizovat tyto funkce s více objekty kontrolují popisovače v poli v pořadí počínaje indexem 0, dokud jeden z objektů není signalován. Pokud se signalizují více objektů, vrátí funkce index prvního popisovače v poli, jehož objekt byl signalován.

Funkce čekání s možností upozornění

MsgWaitForMultipleObjectsEx, SignalObjectAndWait, WaitForMultipleObjectsExa WaitForSingleObjectEx se liší od ostatních funkcí čekání v tom, že mohou volitelně provést upozorňující operaci čekání. V upozorňující operaci čekání může funkce vrátit, když jsou splněny zadané podmínky, ale může se vrátit také v případě, že systém zařadí do fronty rutinu dokončení vstupně-výstupní operace nebo APC ke spuštění čekající vlákno. Další informace o upozorňujících operacích čekání a rutinách dokončování vstupně-výstupních operací najdete v tématu Synchronizace a překrývající se vstupní a výstupní. Další informace o apcs naleznete v tématu asynchronní volání procedur.

Registrované funkce čekání

Funkce RegisterWaitForSingleObject se liší od ostatních funkcí čekání v tom, že operace čekání provádí vlákno z fondu vláken . Při splnění zadaných podmínek je funkce zpětného volání spuštěna pracovním vláknem z fondu vláken.

Ve výchozím nastavení je registrovaná operace čekání operace s více čekáními. Systém resetuje časovač při každém signálu události (nebo vypršení časového limitu), dokud nevoláte UnregisterWaitEx funkce zrušit operaci. Chcete-li určit, že operace čekání by měla být provedena pouze jednou, nastavte dwFlags parametr RegisterWaitForSingleObject na WT_EXECUTEONLYONCE.

Pokud vlákno volá funkce, které používají apcs, nastavte dwFlags parametr RegisterWaitForSingleObject na WT_EXECUTEINPERSISTENTTHREAD.

Čekání na adresu

Vlákno může použít funkci WaitOnAddress a čekat na změnu hodnoty cílové adresy z nějaké nežádoucí hodnoty na jinou hodnotu. To umožňuje vláknům počkat na změnu hodnoty, aniž by bylo nutné otáčet nebo zpracovávat problémy se synchronizací, které mohou nastat, když vlákno zachycuje požadovanou hodnotu, ale hodnota se změní, než vlákno může čekat.

WaitOnAddress vrátí, když kód, který upraví cílovou hodnotu, signalizuje změnu voláním WakeByAddressSingle pro probuzení jednoho čekajícího vlákna nebo WakeByAddressAll probuzení všech čekajících vláken. Pokud je zadaný interval časového limitu s WaitOnAddress a žádné vlákno nevolá funkci wake, funkce se vrátí, když uplynul časový limit. Pokud není zadaný žádný interval časového limitu, vlákno počká neomezeně dlouho.

Funkce čekání a intervaly časového limitu

Přesnost zadaného intervalu časového limitu závisí na rozlišení systémových hodin. Systémové hodiny "odškrtá" konstantní rychlostí. Pokud je interval časového limitu menší než rozlišení systémových hodin, může časový limit čekání vyprší za méně než zadanou dobu. Pokud je interval časového limitu větší než jeden, ale menší než dva, čekání může být kdekoli mezi jedním a dvěma ticky atd.

Pokud chcete zvýšit přesnost intervalu časového limitu pro funkce čekání, zavolejte funkci timeGetDevCaps určit podporované minimální rozlišení časovače a timeBeginPeriod funkce nastavit rozlišení časovače na minimum. Při volání timeBeginPeriodbuďte opatrní, protože časté volání mohou významně ovlivnit systémové hodiny, využití napájení systému a plánovač. Pokud voláte timeBeginPeriod, zavolejte ho jednou dříve v aplikaci a nezapomeňte volat timeEndPeriod funkce na samém konci aplikace.

Wait Functions and Synchronization Objects

Funkce čekání mohou změnit stavy některých typů synchronizačních objektů. K úpravám dochází pouze u objektu nebo objektů, jejichž signalizační stav způsobil vrácení funkce. Funkce čekání mohou změnit stavy synchronizačních objektů následujícím způsobem:

  • Počet objektu semaphore se zmenší o jeden a stav semaforu je nastaven na nonsignaled, pokud je jeho počet nula.
  • Stavy mutex, událost automatického resetování a objekty oznámení změn jsou nastaveny na nepřiřazené.
  • Stav časovače synchronizace je nastaven na nepřiřazené.
  • Stavy událostí ručního resetování, časovače ručního resetování, procesu, vlákna a vstupních objektů konzoly nejsou ovlivněny funkcí čekání.

Wait Functions and Creating Windows

Při použití funkcí čekání a kódu, který přímo nebo nepřímo vytváří okna, musíte být opatrní. Pokud vlákno vytvoří nějaká okna, musí zpracovávat zprávy. Vysílání zpráv se odesílá do všech oken v systému. Pokud máte vlákno, které používá funkci čekání bez časového limitu intervalu, systém zablokuje. Dva příklady kódu, které nepřímo vytvářejí okna, jsou DDE a CoInitialize funkce. Proto pokud máte vlákno, které vytváří okna, použijte MsgWaitForMultipleObjects nebo MsgWaitForMultipleObjectsEx, místo ostatních wait funkcí.