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
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.