Delphi a szakemberek számára

Példa egy többszálas alkalmazás létrehozására Delphi-ban

Ez a rész ismerteti a többszálú alkalmazás egyszerű, de bemutató példányának létrehozásához szükséges lépéseket. Megpróbáljuk kiszámítani a "pi" számot a tizedespont után a maximális pontossággal. Természetesen a beépített Delphi állandó Pi elegendő pontossággal, jobban mondva - a maximális megengedett a legfinomabb 10 byte-os méret a valós számok Extended. Tehát nem fogjuk felülmúlni. De a szálak használatának ez a példája prológként szolgálhat a valódi problémák megoldásához.







Az első példa két szálat tartalmaz: a fő (a felhasználó feldolgozási bemenete) és a számítás; megváltoztathatjuk tulajdonságainkat és megfigyelhetjük a reakciókat. Tegye a következőket:

1. A Delphi környezetben nyissa meg a Fájl menüt, és válassza a NewApplication lehetőséget.

2. Helyezzen öt címkét az űrlapra és egy kapcsolóra, amint az az 1. ábrán látható. 29.2.

Nevezd át a fő űrlapot az fmMainre.

3. Kattintson a Fájl menüre, és válassza a Mentés másként parancsot. Mentse a modult uMain-ként. és a projekt olyan, mint a Threads 1.

Ábra. 29.2. A kérelem formanyomtatványának megjelenése

4. Kattintson a Fájl menüre, és válassza az Új lehetőséget. Ezután kattintson duplán a szál típusú objektumra (a Tárgy objektum ikonra). A NewItems párbeszédpanel, amely a 3. ábrán látható. 29.3.

Ábra. 29.3. Az Új elemek párbeszédpanel a kiválasztott adatfolyam objektummal

Ábra. 29.4. Új témaobjektum párbeszédpanel

5. Amikor megjelenik a szál objektum elnevezésének párbeszédpanel, írja be a TPiThread parancsot, majd nyomja meg a gombot (29.4 ábra). Ezenkívül, ha akarod, akkor a nevét a létrehozott streamhez rendelheti, jelölje be a Megnevezett szál jelölőnégyzetet, és adja meg a nevet a Téma neve mezőben. Mivel a stream nevét csak a jelölés kényelmére használják, ezt a funkciót nem fogjuk használni.

A Delphi létrehoz egy új modult, és sablonba helyezi az új szálat.

6. Az Execute módszerbe bevezetett kód. kiszámítja az n számot egy végtelen Leibniz sorozat konvergenciájával:

Pi = 4 - 4/3 + 4/5 - 4/7 + 4/9 -.







Természetesen egy új érték megjelenítéséhez minden egyes iteráció után ugyanaz lesz, mint egy ágyú lövése a verebeken. Az információk megjelenítéséhez a rendszer tízszer több időt tölt, mint a tényleges számításoknál. Ezért adtunk meg egy updatePeriod konstansot. amely szabályozza az aktuális érték megjelenítésének gyakoriságát.

Az Execute módszer kódja az alábbi:

Javítani kell egy páratlan számot, hogy elkerüljük a villogást. UpdatePeriod = 1000001;

eljárás TPiThread.Execute; var jel. integer;

PiValue, PrevValue. Bővített; i. int64;

PiValue: = PiValue + jel * 4 / (2 * i + l); jel: = -sign;

ha i mod UpdatePeriod = 0 akkor

GlobalPi: = PiValue; GlobalCounter: = i; Szinkronizálás (fmMain.UpdatePi);

amíg Lezárt vagy (Abs (PiValue - PrevValue)<1E-19); end;

7. Kattintson a Fájl menüre, és válassza a Mentés másként lehetőséget. Mentse el a modult a streamen, mint uPiThread .pas.

8. Szerkessze az uMain.pas modul főfájlját, és adja hozzá az uPiThread modult a kezelőfelületen használt modulok listájához. Úgy kell kinéznie:

Windows, Üzenetek, SysUtils, Variants, Classes, Graphics, Controls, Forms, StdCtrls, uPiThread;

9. A TfmMain űrlap nyilvános szakaszában adj hozzá egy hivatkozást a létrehozott szálra: PiThread. TPiThread;

10. Adjon hozzá két globális változót az uMain modulhoz

és a UpdatePi módszer:

ha az iszlám (Application.Handle) akkor

LaValue.Caption: = FloatToStrF (GlobalPi, ffFixed, 18, 18);

lalterNum.Caption: = IntToStr (GlobalCounter) + 'iterációk';

Ez a módszer, ha észrevette, a szálat a Szinkronizálás eljárással hívja meg. Megjeleníti a közelítés aktuális értékét a "pi" számhoz és az iterációk számához.

Abban az esetben, ha a fő alkalmazásablak minimálisra vált, nem történik leképezés; így a telepítés után előfordulhat, hogy egy kicsit várni kell a frissítésre.

11. Kattintson duplán a szabad területre az űrlap munkaterületén, és létrehozza az FormCreate módszertani sablont. Itt a rendszer konstans értéke p ±:

eljárás TfmMain.FormCreate (Feladó: TObject);

laBuiltln.Caption: = FloatToStrF (Pi, ffFixed, 18, 18); végén;

12. Kattintson az alak a kapcsolót (a név cbcalcuiate) függvényt esemény onclick kódot, amely létrehozza és elpusztítja a számítási menet, attól függően, hogy az állam a kapcsoló:

eljárás TfmMain.cbCalculateClick (Feladó: TObject);

kezdődik, ha cbCalculate.Checked majd

PiThread.Resume; végül elkezdődik

ha hozzárendelt (PiThread), majd PiThread.Terminate;

Így a többszálas alkalmazások készen állnak arra, hogy elinduljanak. Ha minden jól megy, akkor a képen látható kép hasonlít a 3. ábrán láthatóhoz. 29.5.

Ábra. 29.5. A futó Threads1 alkalmazás

Ez az egyszerű példa az első lépés arra, hogyan lehet saját osztályokat létrehozni az alap osztályú rrhreadből. Egyszerűsége miatt nem hiányoznak a hiányosságok; Ráadásul, ha nem létezik egy számítási szál, akkor néhány módszer még hibás. De - erről az alábbiakban.




Kapcsolódó cikkek