Delphi programozási patakok

Amikor az alkalmazás elindul, a rendszer automatikusan létrehoz egy szálat futtatni. Ezért, ha egy szálon alkalmazás, az összes kódot hajtja végre egymás után, figyelembe véve az összes feltételes és feltétlen ugrik.

A többszálas egy pszeudo működését több program. Egyes esetekben, létrehozása nélkül szál nem nélkülözhető, például amikor dolgozik foglalatok blokkoló módban.

Delphi van egy speciális osztályt, amely megvalósítja az áramlás - tthread. Ez az alap osztály, ahonnan meg kell örökölni az osztály és felülbírálja az execute módszer.

Most lehet írni a kódot, amelynek végrehajtása akasztottak a szervezetben a program tnew.execute eljárást.

Finom pont. A szervezet szerint az eljárás nem szükséges, hogy hívja az Execute eljárás őse.

Most el kell kezdeni egy szál. Mint minden osztály tnew létre kell hozni:

A True érték a létrehozási módszert jelenti, hogy létrehozása után az osztály patak nem indul el automatikusan.

Akkor azt jelzik, hogy miután a stream, ha már befejeződött, azaz Nem kell aggódnia annak bezárását. Ellenkező esetben, ha maguknak kell hívni a megszüntetésére funkciót.

Mi meg az elsőbbséget egy a lehetséges értékek:

tpidle működik, ha a rendszer üresjáratban
A legalacsonyabb tplowest
tplower Low
tpnormal Normál
nagy tphigher
legmagasabb tphighest
tptimecritical Kritikus

Azt javasoljuk, hogy ne állítsa túl magas prioritású flow jelentősen betölteni a rendszert.

Finom pont. Ha az áramlási van jelen végtelenített semmit, a fluxus rendszer betölti a szemgolyó. Ennek elkerülése érdekében, helyezze alvó funkció (n), ahol n - az ezredmásodperc, hogy az áramlás leáll annak végrehajtását, találkozott ezt a funkciót. n kell választani a feladattól függően.

By the way, ha azt tervezi, hogy írjon kódot áramlás egy külön modul, akkor lehet egy kicsit könnyebb írni egy osztály csontváz. Ehhez jelöljük ki az objektumot áruház - szál objektum (Ez új lapon). Felugrik egy ablak, ahol megadhatja a nevét az osztály, majd az OK gombra kattint, az új modul automatikusan létrehozza a csontváz az osztályban.


Szálszinkronizációt elérésekor a VCL-alkatrészek

Így tudtuk meg, hogy hozzon létre a szálakat. De felmerül egy érdekes dolog: mi történne, ha két szál eléréséhez ugyanazokat az adatokat a lemezre? Például, a két szál próbálja megváltoztatni a cím a fő formája.

Különösen ez a OS szinkronizációs mechanizmusokra végrehajtását. Különösen az osztályban tthread létezik egy olyan módszer, amely lehetővé teszi, hogy ne egyidejű hozzáférést a VCL-elemek:

eljárás Szinkronizálás (módszer: tthreadmethod);

Itt van egy teljes példa, amelyben addstr eljárás hozzáteszi, néhány sort a feljegyzésben. Ha egyszerűen hívja a módszer, a sorok az áramlás lesz hozzá bármilyen sorrendben. Ha a metódusmeghívást addstr szinkronizálni, akkor az első sor adunk egy patak, majd a második. Kiderült, hogy az áramlás kizárólag rögzíti emlékeztető erőforrás, és hozzáadja a szükséges információkat, hozzáadása után egy szál elengedi a feljegyzés, és most van egy másik patak adhatunk a memo az adatokat. Kevesebb szó - több LAS:

felhasználások
ablakok, üzenetek, sysutils, variánsai, osztályok, grafika, ellenőrzés, forma s, dialógusok, stdctrls;

eljárás TForm 1.button1click (feladó: TObject);
kezdődik
new1: = tnew.create (true);
new1.freeonterminate: = true;
new1.s: = '1 menet';
new1.priority: = tplowest;
new2: = tnew.create (true);
new2.freeonterminate: = true;
new2.s: = '2 menet';
new2.priority: = tptimecritical;
new1.resume;
new2.resume;
végén;

eljárás tnew.execute;
kezdődik
szinkronizálni (addstr); // hívása a szinkronizálási
// addstr; // meghívja szinkronizálás nélkül
végén;

Egyéb szinkronizációs módszerek. modul syncobjs

A syncobjs szinkronizáló modul olyan osztályok, tekert hívások api-funkciókat. Összességében, ez a modul be öt osztályba. tcriticalsection, tevent, valamint egyszerűbb végrehajtási osztály tevent - tsimpleevent és használják szinkronizálni szálak, és a többi osztály nem lehet látni. Itt látható a hierarchia osztályok ebben a modulban:

Kritikus szakaszok tcriticalsection

A legegyszerűbb, hogy megértsék tcriticalsection vagy kritikus szakaszban. A kód található kritikus szakaszban végezhető csak egy szál. Elvileg bármilyen kódot, ha nem engedik szabadon, és keresztül érhető el a kritikus szakasz a kódot. Kezdetben a bevitt kód a funkció fejezetet, és fejezze be kilép a szekcióból. Ha egy szakasz által elfoglalt egy másik szál, a szál vár a kritikus szakaszban nem szabadul.


Kezdetben a kritikus szakasz, akkor létre kell hozni:


var
szakasz: tcriticalsection; // globális változó
kezdődik
section.create;
végén;

Feltesszük van egy funkciója, amely az olyan elemek, a globális tömböt:

Tegyük fel, hogy a funkció az úgynevezett több folyamra, úgy, hogy nincs ellentmondás, a kritikus szakasz szerint felhasználható a következő módon:

Meghatározza, hogy a kritikus szakaszok is több. Ezért ha több funkciót, ami lehet a konfliktusok alapján igényüket, hogy hozzon létre egy kritikus szakaszban az egyes funkciók. Miután vége a használatuk, a funkciókat már nem nevezhető a szakasz meg kell semmisíteni.

Ahogy érti, nagyon remélem, hogy a bejárat és a kijárat a kritikus szakasz nem kell az ugyanazt a funkciót. Bejelentkezés csak azt jelenti, hogy egy másik szál találkozik a bejáratnál, és megállapította, beosztása, fel van függesztve. A hozam csak megszabadítja a bejárat. Egész egyszerűen, a kritikus szakasz is képviselteti magát egy szűk cső egy patak, amint az áramlás közeledik az alagút, úgy néz ki rajta, és ha látja, hogy a csövön keresztül már valaki mászik, megvárja, amíg a másik nem jön ki.

Itt egy olyan példa, amelyben az elem hozzáadás egy dinamikus tömb. Sleep funkció egy késés a ciklusban, ami lehetővé teszi, hogy tisztábban lássuk a konfliktus az adatokat, ha természetesen távolítsa el a be- és kilépést a kritikus szakaszt a kódot.

felhasználások
ablakok, üzenetek, sysutils, variánsai, osztályok, grafika, ellenőrzés, forma s, dialógusok, stdctrls, syncobjs;

tnew = osztály (tthread)
védett
eljárás végrehajtására; felülbírálhatja;
végén;

var
forma 1: TForm 1;
cs: tcriticalsection;
new1, new2: tnew;
mas: tömb integer;

eljárás TForm 1.button1click (feladó: TObject);
kezdődik
new1: = tnew.create (true);
new1.freeonterminate: = true;
new1.priority: = tpidle;
new2: = tnew.create (true);
new2.freeonterminate: = true;
new2.priority: = tptimecritical;
new1.resume;
new2.resume;
végén;

Kezdeni nem sok várakozás funkciók. Ez a funkció, amely felfüggeszti a szál. Egy különleges eset a várakozási funkció alvás vezetjük érvként az ezredmásodperc, hogy a szükséges leállítani vagy szüneteltetheti a patak.

Finom pont. Ha hívja alvó (0), az áramlás is feladja a szélütés - CPU időt, majd felkelni a sorban kész végrehajtani.

Várj teljes funkció leírók paraméterként továbbított adatfolyam (ok). Nem fogok lakni őket most részletesen. Alapvetően várjon funkciók magukba bizonyos csoportjai explicit szinkronizálás, a többiek nem kifejezetten.

Események tevent nem csak használják a többszálú alkalmazás, hanem egyetlen szálon összehangolása révén részben a kód és az adatok egy másik alkalmazás. A többszálú alkalmazások használatára tevent tűnik, ésszerű és érthető.

Minden úgy történik, az alábbiak szerint. Ha egy esemény be van állítva, akkor is működik, ha az esemény törlésre kerül, az összes többi szál várnak. A különbség az eseményeket és kritikus szakaszok, hogy az események ellenőrzik a kódot a patak, és használják várakozási függvénnyel. Ha a kritikus szakasz várakozási funkció automatikusan végrehajtásra kerül, a rendezvény kell nevezni, hogy fagyassza be az áramlást.

Az események AUTORESET nélkül auto-reset. A autoreset azt jelenti, hogy azonnal, miután visszatért a várakozás funkció esetén nullázódik. Ha eseményeket anélkül, hogy auto-reset by visszaállíthatja őket.

Esemény nélkül automatikus alaphelyzetbe kényelmes szünet bármely adott részén az áramlás a kódot. Csak szakítsa meg a fal, ahol nem számít, hol fagy be, akkor használja tthread.suspend módszer. Események autoreset lehet használni, valamint a kritikus szakaszokat.

A kezdéshez létre kell hoznia az esemény, és még mielőtt a folyamok segítségével létrehozott őket, bár pontosabb hívni várni-funkciót.

létrehozása (eventattributes: psecurityattributes; manualreset, initialstate: logikai, const neve: string);

eventattributes - nulla venni.
manualreset - Auto Reset - hamis, anélkül, hogy auto-reset - igaz.
initialstate - az eredeti állapot az igazi - fix, hamis - megkönnyebbült.
const neve - az esemény nevét, hogy egy üres. Esemény neve van szükség, ha közötti adatcserére folyamatokat.

Most már minden hiba nélkül.

Könnyebben használható az tsimpleevent osztály, amely az utódja tevent és eltér csak annyiban, hogy kivitelező felhívja a szülő konstruktor, ha a beállított paraméterek:

létrehozása (nulla, igaz, hamis, '');

Sőt, van egy esemény nélkül TSimpleEvent auto Egy Reset állapotban és név nélkül.

Az alábbi példa bemutatja, hogyan függessze fel az áramlás egy bizonyos helyen. Ebben a példában, három formában Folyamatsáv, áramlási kitölti Folyamatsáv. Ha szükséges, akkor szüneteltetheti és folytathatja a töltés progressbar. Ahogy elolvastam, akkor hozzon létre egy eseményt anélkül, auto-reset. Bár Célszerű használni tsimpleevent szoktuk tevent, mert megtanul dolgozni tevent csak megy tovább tsimpleevent.

felhasználások
ablakok, üzenetek, sysutils, variánsai, osztályok, grafika, ellenőrzés, forma s, dialógusok, stdctrls, syncobjs, comctrls;

típus
TForm 1 = osztály (TForm)
button1: TButton;
progressbar1: tprogressbar;
progressbar2: tprogressbar;
progressbar3: tprogressbar;
Button2: TButton;
eljárás a formában (feladó: TObject);
eljárás formájában elpusztítani (feladó: TObject);
eljárás button1click (feladó: TObject);
eljárás button2click (feladó: TObject);
magán

nyilvános

végén;

tnew = osztály (tthread)
védett
eljárás végrehajtására; felülbírálhatja;
végén;

eljárás TForm 1.form létre (feladó: TObject);
kezdődik
// Létrehozunk egy eseményt, mielőtt használni
esemény: = tevent.create (nulla, igaz, az igaz, '');
// Kezdés patak
új: = tnew.create (true);
new.freeonterminate: = true;
new.priority: = tplowest;
new.resume;
végén;

eljárás TForm 1.button1click (feladó: TObject);
kezdődik
// Állítsd az esemény
// várakozási funkció fozvraschat ellenőrzés azonnal
event.setevent;
végén;

eljárás TForm 1.button2click (feladó: TObject);
kezdődik
// várakozási funkció blokkolja a menet kód
event.resetevent;
végén;


Egy példa a használó események autoreset a munka a két áram, és a következőképpen működik. Egy szál előkészíti az adatokat, és egy másik szál, miután az adatok teljesek, nos, például ezeket elküldi a szerver vagy valahol máshol. Kiderült egyfajta alternatív munkát.

felhasználások
ablakok, üzenetek, sysutils, variánsai, osztályok, grafika, ellenőrzés, forma s, dialógusok, stdctrls, syncobjs, comctrls;

tproc = osztály (tthread)
védett
eljárás végrehajtására; felülbírálhatja;
végén;

tsend = osztály (tthread)
védett
eljárás végrehajtására; felülbírálhatja;
végén;

eljárás TForm 1.form létre (feladó: TObject);
kezdődik
// Létrehozunk egy eseményt, mielőtt használni
esemény: = tevent.create (nulla, a hamis, igaz, '');
// indul a menet
proc: = tproc.create (true);
proc.freeonterminate: = true;
proc.priority: = tplowest;
proc.resume;
Levél: = tsend. létrehozása (true);
küldeni. freeonterminate: = true;
küldeni. prioritás: = tplowest;
küldeni. folytatásához;
végén;

Ez minden tárgyat syncobjs szinkronizáló modul, ami elvileg elég, hogy megoldja a különböző problémákat. Az ablakok vannak más szinkronizációs objektum, amely szintén használható a Delphi, de az API szinten. Ez mutex - mutexek, szemafor - szemafor és várható időzítő.

Kapcsolódó cikkek