8.4 Többszálú alkalmazások készítése



Hasonló dokumentumok
Számítógépes grafika

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

3.2. Az alkalmazások ablaka

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Programozási alapismeretek (M1,M2)

SZÁMÍTÓGÉPI GRAFIKA VÁGÁS

BME MOGI Gépészeti informatika 14.

BME MOGI Gépészeti informatika 18. Grafika, fájlkezelés gyakorló óra. 1. feladat Készítsen alkalmazást az = +

Algoritmizálás és adatmodellezés tanítása 1. előadás

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

PROGRAMOZÁS VIZUÁLIS/GRAFIKUS FEJLESZTŐI KÖRNYEZETBEN (MINIMÁLIS TUDNIVALÓK)

Egyszerű programok kezdőknek

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Hetedik témakör kiegészítés:

Delphi programozás III.

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

BME MOGI Gépészeti informatika 6.

BME MOGI Gépészeti informatika 15.

Informatika terméktervezőknek

Makrók használata az Excelben - Makróhibák kezelése, biztonságos jelszavak generálása

3.1 A Windows alkalmazás (project) felépítése

Programozás Delphi-ben 2

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

components : IContainer dx : int dy : int tmidőzítő : Timer toolstripseparator1 : ToolStripSeparator tsmikilépés : ToolStripMenuItem

PROGRAMOZÁS DELPHIBEN II.

Delphi programozás IV.

Szoftvertechnológia alapjai Java előadások

A szerzõrõl... xi Bevezetés... xiii

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Programozás Delphi-ben 2

Concurrency in Swing

Tervezzük meg a program menürendszerét! A TForm1 osztály deklarációja:

Menük használata

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Rendezések. A föltöltés nemcsak az r-re vonatkozik, hanem az s-re is. Ez használható föl a további rendezések

VISUAL BASIC ALAPISMERETEK

Közismereti informatika 2.zh T-M szakirány

munkafüzet open eseményéhez

Java és web programozás

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

2. lépés A Visszaállítási pont leírása: mezőbe gépeld be: Új alkalmazás telepítése!

Egyszerű példaprogramok gyakorláshoz

LabVIEW példák és bemutatók KÉSZÍTETTE: DR. FÜVESI VIKTOR

Oktatási segédlet 2014

Delphi programozás I.

Johanyák Zsolt Csaba: Grafikus felület programozása. Copyright 2008 Johanyák Zsolt Csaba

Konkurens TCP Szerver

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Algoritmusok helyességének bizonyítása. A Floyd-módszer

7. Előadás. Makrók alkalmazása. Salamon Júlia. Előadás I. éves mérnök hallgatók számára

Feltételezés: A file strukturálisan helyes, tanszékenként nem üres, de az adott listázási feladatban kikötött számút nem haladja meg.

Stateless Session Bean

Internet programozása. 3. előadás

Android Commander Felhasználói kézikönyv

Java programozási nyelv

Hozzunk létre két rekordot a táblában, majd véglegesítsünk (commit):

BME MOGI Gépészeti informatika 7.

Tájékoztató. Használható segédeszköz: -

Pénzügyi algoritmusok

Tartalomjegyzék. Bevezetés...2

Eseményvezérelt alkalmazások

Grafikus felületek a programozó szempontjából grafikus elemek absztrakt reprezentációja az egyes elemek tulajdonságait leíró adatstruktúrák.

BME MOGI Gépészeti informatika 4.

Szoftvertechnolo gia gyakorlat

Imperatív programozás

Vizuális, eseményvezérelt programozás I.

17. Többdokumentumos alkalmazások készítése..3 A többdokumentumos felület...3. A program elkészítése...27

Megoldott feladatok. Informatika

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

CAD-ART Kft Budapest, Fehérvári út 35.

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

Programozási nyelvek Java

Számítógépes grafika

Ugráló gomb oktatási segédlet Ugráló gomb

Broadcast Service Widget

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

CAN alapú járműves adatokat megjelenítő szoftver fejlesztése

A Java nyelv. Dialógus ablakok. Elek Tibor

Programozási nyelvek és módszerek Java Thread-ek

BME MOGI Gépészeti informatika 13.

Thermo1 Graph. Felhasználói segédlet

Java II. I A Java programozási nyelv alapelemei

Access adatbázis elérése OLE DB-n keresztül

Komputeralgebra Rendszerek

VII. Appletek, grafika

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

ELTE SAP Excellence Center Oktatóanyag 1

Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click Dim tipp As Integer

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 3. előadás

A C# programozási nyelv alapjai

Web-technológia PHP-vel

Android Commander Felhasználói kézikönyv

Vezérlési szerkezetek Vezérlési szerkezetek: feltételes elágazás és ciklusok

Átírás:

8.4 Többszálú alkalmazások készítése 1. Egyszerű többszálú alkalmazás Szalak 2. Prímszámok előállítása programszálban Primszalp 3. Grafika készítése programszálakban SzalGrafika 1

Készítsünk programot, amely két azonos számlálást végző programszálat tartalmaz! A szálak legyenek indíthatók és leállíthatók, illetve különböző prioritásúak! (Szalak) Helyezzünk egy formra két Panelt, a két panelre egy-egy ProgressBar vezérlőt a szálak folyamatainak kijelzésére, és két jelölőnégyzetet a szál indítására és felfüggesztésére. Készítsünk a programban egy új szálat a New Thread Object választással. Legyen az új szál TSzal, az elkésztett modult pedig nevezzük át Szalu-ra. Duplázzuk meg a modulban a szálobjektumokat, legyen a második neve TSzali. Mindkét osztálydefiníció az Execute metódus mellet tartalmazzon egy Friss metódust az állapotkijelzés frissítésére! Mindkét Execute metódus számlálást végez az i1 és az i2 változókban. uses Classes; i1:integer=0; // Az első számláló i2:integer=0; // Az második számláló A szálakat azonos módon deklaráljuk: type // Az egyik szál objektum TSzal = class(tthread) procedure Friss; //Kijelzés a ProgressBar1-n private { Private declarations } protected procedure Execute; override; // A szál kódja Az implementation részben gondoskodunk arról, hogy elérjük a formot. implementation // Hogy elérjük a formot uses unit1; 2

A szálak hasonló metódusokkal rendelkeznek, így csak az egyik szálét mutatjuk be: // TSzal procedure TSzal.Friss; Form1.ProgressBar1.Position:=i1 div 10; procedure TSzal.Execute; while not terminated do inc(i1); // Számlálás Synchronize(Friss); // A kijelzés szinkron frissítése if i1=1000 then i1:=0; { Place thread code here } A főablak moduljába beépítjük a szalu modult és deklaráljuk a szal és szali szálakat uses szalu; szal:tszal; szali:tszali; A form létrehozásakor a szálak különböző prioritással jönnek létre. procedure TForm1.FormCreate(Sender: TObject); // Szálak létrehozása és a prioritások beállítása Szal:=TSzal.Create(true); Szal.Priority:=tpLower; Szali:=TSzali.Create(true); Szali.Priority:=tpHigher; Lebontáskor megszüntetjük a szálakat is. procedure TForm1.FormDestroy(Sender: TObject); // Szálak lebontása Szal.Terminate; Szal.Free; Szali.Terminate; Szali.Free; A jelölőnégyzetek állapotától függ, hogy fut-e a szál. procedure TForm1.CheckBox1Click(Sender: TObject); // A jelölőnégyzet // felfüggeszti/indítja a szálat if CheckBox1.Checked then Szal.Resume else Szal.Susp 3

Készítsünk alkalmazást, amely prímszámokat állít elő önálló szinkron és aszinkron szálban, és a generált számokat listába tölti! (Primszalp) Először tervezzük meg az alkalmazás felületét! Legyen beállítható egy alsó határ és egy felső határ, amelyek között a prímszámokat keressük (edalsohatar és edfelsohatar)! A Szinkronizáció című (Radiogroup1) választógomb-csoportban szabályozzuk, hogy szinkron, vagy aszinkron módon fusson a szál. A btnprimclick indítja a számgenerálást. A számok az lstprimek listába kerülnek, melynek tartalma a btmlistatorles gombbal törölhető. Az tesztelő program főablakának modulja: unit primform; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, PrimSzal, StdCtrls, ExtCtrls; type TForm1 = class(tform) btnprim: TButton; lstprimek: TListBox; edfelsohatar: TEdit; Label1: TLabel; RadioGroup1: TRadioGroup; Label2: TLabel; edalsohatar: TEdit; btmlistatorles: TButton; procedure btnprimclick(sender: TObject); procedure btmlistatorlesclick(sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } protected SajatSzal : TPrimSzal; public { Public declarations } Form1: TForm1; StartPosX, StartPosY: Integer; implementation {$R *.DFM} procedure TForm1.btnPrimClick(Sender: TObject); SajatSzal := TPrimSzal.Create(False); procedure TForm1.btmListaTorlesClick(Sender: TObject); lstprimek.clear; end. 4

Miután az alkalmazás felületét megterveztük, és mielőtt elindítanánk a programot készítsük el a szálat (File/New/ThreadObject), amelyre a SajatSzal hivatkozik! Legyen a szál neve TPimSzal! A prímszámgenerálás választógomb-csoporttól függően, szinkron vagy aszinkron, azaz a Shyncronize metódussal, vagy a nélkül indítjuk a szálat. A Primszamok metódus a megadott határok között a lokális Prim függvény hívásával generálja a számokat és beírja a listába azokat. Amíg a szál fut, az alkalmazás ablakának címsorában a A feltöltés folyamatban... szöveget látjuk, amikor végez a prímszámgeneráló metódus az Az alkalmazás főablaka szöveget írja a form címsorába. unit PrimSzal; interface uses Classes, StdCtrls; type TPrimSzal = class(tthread) private { Private declarations } protected procedure Execute; override; procedure Primszamok; procedure Kilepeskor(Sender: TObject); implementation uses PrimForm,SysUtils; procedure TPrimSzal.Execute; Self.OnTerminate:=Kilepeskor; case form1.radiogroup1.itemindex of 0 : Synchronize(Primszamok); 1 : Primszamok; procedure TPrimSzal.Primszamok; function Prim(p:Int64):boolean; m:int64; i : longint; m:=round(sqrt(1.0*p)); result:=true; for i:=2 to m do if p mod i = 0 then result:=false; break; khatar, vhatar,p: int64; Form1.Caption := 'A feltöltés folyamatban...'; try khatar:=strtoint64(form1.edalsohatar.text); vhatar:=strtoint64(form1.edfelsohatar.text); except khatar:=1; vhatar:=100; p:=khatar; while p<=vhatar do if Prim(p) then Form1.lstPrimek.Items.Add(Format('%d',[p])); inc(p); 5

procedure TPrimSzal.Kilepeskor(Sender: TObject); Beep; Form1.Caption := 'Az alkalmazás főablaka'; end. 6

Készítsünk többszálú alkalmazást, ahol szálak téglalapot jelenítenek meg véletlen pozícióban és színnel! A szálobjektumok tárolásához használjunk objektumlistát! (SzalGrafika) A rajzoláshoz önálló szálat készítünk, amelyet azonban most nem külön modulban, hanem a form moduljában helyezünk el. A szál létrehozásakor paraméterként megkapja a form azonosítóját (AForm), amelyen dolgoznia kell, és a színt (AColor), amellyel rajzolni fog. A szál, futás közben ciklusban véletlen módon előállított téglalapokat rajzol a formra, a megadott színű vonallal. Ahhoz, hogy a közösen használt formon a különböző szálak ne keverjék össze az adatokat, a rajzolás megkezdésekor lezárjuk a formot a többi szál elől (Lock), majd a végén felszabadítjuk (UnLock) azt. A szál deklarációja: TRajzoloSzal = class(tthread) private FColor: TColor; FForm: TForm; public constructor Create(AForm: TForm; AColor: TColor); procedure Execute; override; A metódusok megvalósítása: constructor TRajzoloSzal.Create(AForm: TForm; AColor: TColor); FColor := AColor; FForm := AForm; inherited Create(False); procedure TRajzoloSzal.Execute; function VeletlenTeglalap:Trect; MaxX, MaxY: Integer; MaxX := FForm.ClientWidth; MaxY := FForm.ClientHeight; result.left := Random(MaxX-100); result.top := Random(MaxY-100); result.right := result.left+100; result.bottom := result.top+100; R : TRect; // Megállás után megszűnik a szál FreeOnTerminate := True; // A szál legfeljebb az alkalmazás megállásáig fut while not (Terminated or Application.Terminated) do R:=VeletlenTeglalap; with FForm.Canvas do Lock; // a canvas lezárása // a következő utasításokat egy időben csak egy szál hajthatja végre Pen.Color := FColor; Brush.Style:=bsClear; with r do Rectangle(left, top, right, bottom); Unlock; // a canvas megnyitasa 7

Maga az alkalmazás menüvezérelten működik. A szálak szinkronizálásához szükséges a SyncObj modul. A szálak adatait a SzalLista objektumlistában tároljuk. unit SzalGrafU; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, Contnrs, Math, syncobjs; type TSzalakForm = class(tform) MainMenu1: TMainMenu; Muveletek: TMenuItem; SzalHozzaadasa: TMenuItem; SzalLevetele: TMenuItem; ColorDialog1: TColorDialog; VeletlenSzal: TMenuItem; MindenLevetele: TMenuItem; Kilepes: TMenuItem; PillanatFelvetel: TMenuItem; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure SzalHozzaadasaClick(Sender: TObject); procedure SzalLeveteleClick(Sender: TObject); procedure VeletlenSzalClick(Sender: TObject); procedure MindenLeveteleClick(Sender: TObject); procedure KilepesClick(Sender: TObject); procedure Kijelzes(db:Integer); procedure PillanatFelvetelClick(Sender: TObject); private SzalLista: TObjectList; public { Public declarations } SzalakForm: TSzalakForm; resourcestring Fejlec='Többszálú grafikus alkalmazás'; A funkciók megvalósítása az implementation részben történik. A form létrehozásakor létrehozzuk a szállistát is, amit a lebontáskor szintén meg kell szüntetni. procedure TSzalakForm.FormCreate(Sender: TObject); // Objektumlista a szálobjektumok tárolására SzalLista := TObjectList.Create; // A lista nem törli a levett szálakat SzalLista.OwnsObjects:=false; Kijelzes(0); procedure TSzalakForm.FormDestroy(Sender: TObject); // Minden szál levétele a listából MindenLeveteleClick(nil); // Az objektumlista lebontása SzalLista.Free; 8

A form fejlécébe a Kijelzes metódussal írunk. procedure TSzalakForm.Kijelzes(db:Integer); caption:=fejlec+format(' - a szálak száma: %03d.',[db]); A menüpontok metódusai (a menüpontok elnevezése utal az elvégzendő feladatra): procedure TSzalakForm.SzalHozzaadasaClick(Sender: TObject); // Új szál létrehozása a bekért szín átadásával és hozzáadása a listához if ColorDialog1.Execute then with SzalLista do Add(TRajzoloSzal.Create(Self, ColorDialog1.Color)); TRajzoloSzal(SzalLista[Szallista.count-1]).Priority := tplowest; Kijelzes(SzalLista.count); procedure TSzalakForm.SzalLeveteleClick(Sender: TObject); if SzalLista.Count>0 then // az utolsó szál kivétele a listából és a szál törlése TRajzoloSzal(SzalLista[SzalLista.Count - 1]).Terminate; SzalLista.Delete(SzalLista.Count - 1); Kijelzes(SzalLista.Count); if SzalLista.Count=0 then Invalidate; procedure TSzalakForm.VeletlenSzalClick(Sender: TObject); i: Integer; // Véletlen számú szál felvétele a listába // véletlen színbeállításokkal for i := 1 to 2+random(10) do SzalLista.Add(TRajzoloSzal.Create(Self, rgb(random(256),random(256),random(256)))); Kijelzes(SzalLista.count); procedure TSzalakForm.MindenLeveteleClick(Sender: TObject); i: Integer; Cursor := crhourglass; try for i := SzalLista.Count - 1 downto 0 do TRajzoloSzal(SzalLista[i]).Terminate; TRajzoloSzal(SzalLista[i]).WaitFor; SzalLista.Clear; Kijelzes(SzalLista.count); Repaint; finally Cursor:= crdefault; 9

procedure TSzalakForm.KilepesClick(Sender: TObject); Close; Pillanatfelvételként megállítjuk egy másodpercre a szálak futását. procedure TSzalakForm.PillanatFelvetelClick(Sender: TObject); i:integer; for i:=0 to SzalLista.Count-1 do TRajzoloSzal(SzalLista[i]).Susp Sleep(1000); for i:=szallista.count-1 downto 0 do TRajzoloSzal(SzalLista[i]).Resume; A modul inicializáló részében inicializáljuk a véletlenszám-generátort. initialization Randomize; end. Az alkalmazás futás közbeni ablaka: 10