Szálkezelése Delphi - mindent róla, és a programozás

Mindenki tudja, hogy a Windows egy multitasking. Leegyszerűsítve ez azt jelenti, hogy több program is futhat egyszerre az OS. Minden nyitottunk Feladatkezelő és megjelenik egy lista a folyamatokat. A folyamat - egy példánya a futó alkalmazás. Sőt, önmagában nem végez, akkor jön létre, amikor az alkalmazás elindul, tulajdonosi információt tartalmaz, amelyen keresztül a rendszer működik vele, úgyhogy nem ő osztja meg a szükséges memória kód és az adatok. Annak érdekében, hogy a program működik, akkor létrejön az áramlás. Bármely folyamat legalább egy szál, és ez felelős a kódfuttatást és megszerzi a CPU időt. Ez úgy érhető el, és a képzeletbeli párhuzamos munkaprogramok vagy ahogy nevezik, egy ál. Miért képzeletbeli? Igen, mert valójában a processzor egy időben képes szállítani csak egy darab kódot. A Windows forgalmaz CPU időt az összes szálat a rendszerben, egyenként, így úgy tűnik, hogy működik egy időben. Tényleges flow párhuzamosan működő lehet csak gépeken két vagy több processzor.

Hogy további meneteket Delphi van egy alap osztály TThread, abból mi lesz örökölt végrehajtásában falukon. Annak érdekében, hogy hozzon létre egy „csontváz” egy új osztály, akkor válassza ki a Fájl menü - Új - szál objektum, Delphi létrehoz egy új modul a munkadarab a kategóriájában. Fogom leírni prezentációs formában modult. Mint látható, ebben a betakarítás felvett egy módszer - Execute. Ennyi, és meg kell, hogy felülbírálja a kód benne, és működni fog egy külön téma. És így, írjunk egy példát - fut egy végtelen hurok áramlását:
Fuss a minta elvégezni, és kattintson. Úgy tűnik, semmi sem történik - a forma nem lógott, reagál a mozgásra. Valójában ez nem így van - menjen Task Manager, és látni fogja, hogy a CPU betöltött teljes. Most a folyamat az alkalmazás fut két szál - az egyik jött létre először, amikor az alkalmazás elindul. A második, amely a hajó, mint egy processzor - hoztuk létre az egy gombnyomással. Tehát, lássuk, mit jelent a kódot Button1Click:
Itt létrehoztunk egy példánya TNewThread. Hozzon létre egy kivitelező csak az egyik lehetőség - CreateSuspended logikai típusú, ami azt jelzi, indítson egy új témát után azonnal létrehozását (ha hamis), vagy várjon parancsot (ha igaz).
FreeOnTerminate tulajdonság meghatározza, hogy az adatfolyam vége után automatikusan, az objektum kell semmisíteni, és nem lesz, hogy elpusztítsa azt kézzel. A mi példánkban ez nem számít, mert önmagában soha nem lesz kész, de szükség lesz a következő példák.
Prioritás tulajdon, ha még nem sejtette már a nevét, beállítja a szál prioritása. Igen, igen, minden szálat a rendszer saját prioritása. Ha a processzor idő nem elég, akkor a rendszer elkezd szétosztása prioritás szerint patak. Prioritás tulajdonság a következő értékeket:
  • tpTimeCritical - Kritikus
  • tpHighest - nagyon magas
  • tpHigher - nagy
  • tpNormal - Intermediate
  • tpLower - Alacsony
  • tpLowest - nagyon alacsony
  • tpIdle - patak fut közben rendszer üresjárati idő
Cél kiemelt áram nem szükséges, kivéve ha azt a feladatot, mivel ez nagy terhelést jelent a rendszerben.
Nos, valóban, az áramlás indul.

Azt hiszem, most már értem, hogy szálak jönnek létre. Jegyezzük meg, nem bonyolult. De nem minden ilyen egyszerű. Úgy tűnik - írjon semmilyen kódot az Execute eljárás, és mindent, és nem adatfolyamok egy kellemetlen tulajdonság - nem tudják egymásról semmit. És akkor mi van? - Azt kérdezed. Íme: tegyük fel, hogy próbál változtatni az áramlás a többi tulajdonság bármely komponens formájában. Mint ismeretes, a VCL egyszeri beutazásra, az összes kódot az alkalmazás végrehajtása egymás után. Például a folyamat minden megváltozott adatok belül osztályok VCL a rendszer kiválasztja a pillanatban a fő áramlási halad körül más folyamatok és visszatér, a kód végrehajtása folytatódik attól a ponttól, ahol a megrekedt. Ha nem vagyunk ki a flow változás valamit, például, abban a formában, részt vesz a sok mechanizmus VCL (I emlékeztessen az alap áramlás most „felfüggesztett”), illetve ez idő alatt lesz ideje változtatni az adatokat. Hirtelen időt kap a fő áramlási megint csendben folytatja annak végrehajtását, de az adatok megváltoztak! Mert mit is vezethet - lehetetlen megjósolni. Akkor nézd meg ezerszer és nem történik semmi, és az ezer és az első program összeomlik. Ez nem csak, hogy befolyásolja a fő áramlási további, hanem a kölcsönhatás a folyamok között. Írja ilyen megbízhatatlan program természetesen lehetetlen.

szálszinkronizációt

Lehet, hogy észrevette, hogy használjuk a Sleep folyamat a ciklusban. Egy egyszálú alkalmazás Sleep ritkán használják, de az áramlás nagyon kényelmes a használata. Példa - egy végtelen ciklusban, amíg meg nem valamiféle állapotban. Ha nem helyezi be a Sleep egyszerűen betölteni a rendszer használhatatlan munkát.

Itt elvileg takartuk az alapvető módon együttműködik a komponensek a VCL menet. És mi van, ha a program nem új téma, de több? És meg kell szervezni a munkát, ugyanazokat az adatokat? Itt jön a támogatás más szinkronizációs módszerek. Egyikük tartjuk. Hajtják végre, meg kell adni a projekthez SyncObjs modult.

kritikus szakaszok

Ezek a következőképpen működik: csak egy szál, a másik vár, annak befejezését működhet belsejében egy kritikus szakasz. Hogy jobban megértsük minden összehasonlítást végzünk egy keskeny cső, elképzelni, egyrészt „tömeg” folyik, de a cső „mászni” az egyetlen, és amikor „átvészelni” - kezdődik a második tételben, és ezért annak érdekében. Még könnyebb megérteni ezt egy példa, és ugyanazt a ProgressBar'om. Tehát futtatni egy adott példa korábban. Kattintson a gombra, várjon néhány másodpercet, majd nyomja meg újra. Mi folyik itt? Folyamatsáv kezdett ugrani. Jumping mert mi foglalkoztat több mint egy folyam, hanem két, és mindegyikük közvetít különböző jelentése haladást. Most egy kicsit átdolgozni a kódot onCreate esemény formák teremt kritikus szakasz:
Van két TCriticalSection módszerre van szükség, belépnek és elhagyják, illetve ki és őt. Mi helyet a kódot a kritikus szakasz:
Próbáld meg futtatni az alkalmazást, és nyomja meg a gombot többször, majd számolja meg, hányszor lesz előrelépés. Nyilvánvaló, hogy mi a lényege? Az első alkalommal, amikor megnyomja a gombot, akkor hozzon létre egy áramlás, hogy vesz egy kritikus szakaszt, és elkezd dolgozni. Tolja a második - a második menet jön létre, de a kritikus szakaszban foglalt, és arra vár, amíg le nem az első. A harmadik, negyedik - minden csak át a sorban.

Kritikus szakaszokat kényelmesen alkalmazható a feldolgozó ugyanazon adatok (listák, tömbök) különböző szálak. Ha megértjük, hogyan működik, akkor mindig talál egy használni őket.

Ebben a kis cikkben nem terjed ki minden módszer szinkronizálás, vannak olyan események (TEvent), valamint a rendszer-objektumok, mint mutexes (Mutex) szemaforokat (Szemafor), de ők inkább alkalmas kommunikációs alkalmazások között. A többi, tekintettel a használat TThread osztály, meg lehet tanulni a saját, a HELP'e mind nagyon részletes. A célja ennek a cikknek - megmutatni kezdő, ez nem olyan kemény és ijesztő dolog, hogy kitaláljuk, mi az, ami. És sok gyakorlatot - a legfontosabb dolog az élmény!

Kapcsolódó cikkek