Programozás ablakokhoz nt

Kezdjük egyszerűen: beszéljünk arról, hogy egy feladat várhat egy másik feladat befejezésére vagy egy folyamat befejezésére.

Ha kell, hogy egy feladat befejezésére vár más feladatok futtatása ugyanazon folyamaton belül, akkor hajlamos lehet arra, hogy végezze el ezt a várakozást egy globális változót, amelynek tartalma változik a befejezése a második feladat. Az első feladat ezután áttanulmányozhatja a globális változó tartalmát egy hurokban, várva a pillanatig, amikor változik.

Ennek a megközelítésnek a nyilvánvaló hátránya, hogy a várakozó feladat a CPU-idők kvantumát kapja. Ez csökkenti a rendszer általános teljesítményét, ezért a várakozás teljesítéséhez másik módot kell találnia. Jó lenne megszervezni a várakozást oly módon, hogy a feladat ütemezője ne osztja fel a CPU-időt olyan feladatokra, amelyek várnak valamire.

Várakozás a feladat vagy folyamat befejezésére

Ha egy feladat vagy egy folyamat befejezését meg kell várni, a legjobb, ha ezt a WaitForSingleObject XE "WaitForSingleObject" függvényt használjuk. amellyel már ismertek a korábbi alkalmazásokban.

A WaitForSingleObject függvény prototípusa az alábbi:

Paraméterként hObject ezt a funkciót, meg kell adnia az azonosítóját a tárgy, amelyre várnak, és paraméterként dwTimeout - timeout ezredmásodperc (várjon lehet végtelen, ha az idő adja VÉGTELEN érték).

A Microsoft Windows NT operációs rendszer számos objektuma - például a feladat, a folyamat és a feladat azonosítók - két állapotban állhat - jelezve és ki nem rendezve. Különösen, ha a feladat vagy a folyamat végrehajtási állapotban van (azaz működik), akkor a megfelelő azonosítók nem ellenőrzött állapotban vannak. Amikor a feladat vagy folyamat befejezi munkáját, az azonosítók megjelennek (vagyis a jelzett állapotba kerülnek).

Ha a feladat létrehoz egy másik feladatot vagy folyamatot, majd felhívja a WaitForSingleObject XE funkciót "WaitForSingleObject". megadva a létrehozott feladat azonosítóját, és az INFINITE XE "INFINITE" második paraméterként. az alap feladat várakozó állapotba kerül. Várakozási állapotban lesz, amíg a gyermek feladata vagy folyamata befejezi munkáját.

Megjegyezzük, hogy a WaitForSingleObject funkció nem ellenőrzi az állapotát a feladat azonosítóját a gyermek folyamat, illetve a hurok, vár rá (vagy) befejezését. Egy ilyen művelet a CPU idő kvantumának az alap feladathoz való hozzárendeléséhez vezetne, ami pontosan azt szeretné elkerülni. Ehelyett a funkció WaitForSingleObject jelentések ütemező feladatok végrehajtását a szülő feladata, ezt a funkciót, akkor fel kell függeszteni, amíg a gyermek feladat vagy folyamat nem fejezi be munkáját.

Amikor eldönti, hogy a CPU időt szelet-e a szülő feladatnak, akkor az ütemező ellenőrzi a gyermek feladat állapotát. Az időmérőt az ütemező adja ki a szülő feladatnak csak akkor, ha a gyermek feladat befejezte munkáját, és annak azonosítója megjelölt állapotban van. Az ilyen teszt nem időigényes, és ezért nem vezet a rendszer teljesítményének jelentős csökkenéséhez.

Az 1. ábrán. A 4.1. Ábrán látható, hogy az 1. feladat törekszik a feladat befejezésére a hThread2 azonosítójú 2-es számmal.

A pontozott nyíl olyan eseményt mutat, amely a várakozás befejezéséhez vezet. Ez az esemény nyilvánvalóan a hThread2 feladat befejezése.

Példaként a funkció WaitForSingleObject XE „WaitForSingleObject” kell várni a gyermek folyamat, fontolja meg egy kissé módosított fragmentum az eredeti szöveg pstart alkalmazás, amelyet az előző fejezetben:

Itt a CreateProcess funkcióval a fő feladat elindítja a folyamatot. A folyamat azonosítója a pi szerkezet hProcess mezőjében tárolódik. Ha a folyamat sikeresen megkezdődött, az alkalmazás fõ feladata felfüggeszti munkáját addig, amíg a futó folyamat befejezi munkáját. Ehhez a "WaitForSingleObject" WaitForSingleObject XE függvényt hívja. átadva a futó folyamat azonosítójának.

Ha a szülőfolyamatot nem érdekli a gyermeke folyamatának sorsa, akkor a WaitForSingleObject funkcióra nincs szükség. Ebben az esetben a fő feladat azonnal bezárhatja a gyermekprocesszus azonosítóit és a gyermekprocesszus fő feladatát, megszüntetve a "szülői kapcsolatokat":

Az így megkezdett folyamatot elkülönítettnek nevezik. Ő fogja élni az életét, függetlenül a folyamat állapotától, amely elindította.

Most beszéljünk a WaitForSingleObject függvény befejezési kódjáról.

Hiba esetén a függvény a WAIT_FAILED értéket adja vissza. A hibakód a GetLastError funkcióval érhető el.

Ha a függvény sikeres, akkor visszatérhet az alábbi három érték: WAIT_OBJECT_0, WAIT_TIMEOUT vagy WAIT_ABANDONED.

Ha a várakozás tárgyát képező azonosító állapota megjelölve lett, a függvény a WAIT_OBJECT_0 értéket adja vissza. Így, amikor azt várjuk a befejezése a feladat és a feladat befejeződött, a „természetes úton”, a függvény WaitForSingleObject XE „WaitForSingleObject” visszatér ezt az értéket.

Ha a WaitForSingleObject függvény második paraméterében megadott időtúllépés lejárt, de az objektum soha nem járt a megjelölt állapotba, akkor a WAIT_TIMEOUT értéket visszaadják. Nyilvánvaló, hogy végtelen várakozással soha nem kapod meg ezt a kilépési kódot.

A WAIT_ABANDONED kitöltési kód visszaküldik a Mutex típusú szinkronizációs objektumhoz (amelyet később tárgyalunk), amelyet a feladat befejezése után nem adtak ki. Így ebben az esetben a várakozást törölték, és a megfelelő objektum (Mutex) nem lépett be a megjelölt állapotba.

Várakozás több feladat vagy folyamat befejezésére

Gyakran egy feladat vár több feladat vagy folyamat befejezésére, vagy egy több feladatra vagy folyamatra. Ezt a várakozást nem nehéz elérni a WaitForMultipleObjects funkcióval, amelynek prototípusa az alábbiakban látható:

Ha a tartalmát a paraméter fWaitAll TRUE, akkor a feladat átkerül a készenléti állapot mindaddig, amíg az összes feladatot, folyamatok, illetve azonosítókat tömb tárolja lphObjects, befejezték a munkát. Abban az esetben, ha az fWaitAll értéke FALSE, a várakozás leáll, ha a megadott feladatok vagy folyamatok egyike megszűnik. Végtelen várakozás, mint a WaitForSingleObject XE funkció esetében, "WaitForSingleObject". Az INFINITE értéket a dwTimeout paraméteren keresztül kell átadni.

Hogyan használja ezt a funkciót?

Példa a korábban leírt MultiSDI alkalmazás forráskódjára.

Először is létre kell hoznia egy tömböt a feladat azonosítók vagy folyamatok tárolására, amelyek befejezéséhez várnia kell:

Ezt követően a futó feladatok vagy folyamatok azonosítóit be kell írni a tömbbe:

Ebben az esetben a WaitForMultipleObjects függvényt okozó feladat a várakozási állapotba kerül, amíg mind a három feladat befejezi munkáját.

A WaitForMultipleObjects függvény a következő értékek valamelyikét adhatja vissza:

· WAIT_FAILED (hiba esetén);

· WAIT_TIMEOUT (ha az időtúllépés ideje lejárt);

· Egy közötti értéket WAIT_OBJECT_0 a (WAIT_OBJECT_0 + cObjects - 1), amely attól függően, fWaitAll tartalom paramétert vagy azt jelenti, hogy az összes várható azonosítók vezetjük jelölt állapot (ha fWaitAll volt egyenlő TRUE), vagy ezt az értéket, ha levonjuk belőle állandó WAIT_OBJECT_0, egyenlő az objektum azonosítójának indexével az lphObjects azonosítók tömbjében.

· Egy közötti értéket WAIT_ABANDONED_0 a (WAIT_ABANDONED_0 + cObjects - 1), ha az elvárást Mutex tárgyak törölték. Az lphObjects tömbben lévő megfelelő objektum indexét úgy határozhatjuk meg, hogy kivonjuk a WAIT_ABANDONED_0 értéket a visszatérési kódból.

Kapcsolódó cikkek