Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Cserép Máté

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése II 8. előadás. Összetett WPF alkalmazások. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Eseményvezérelt alkalmazások fejlesztése II 11. előadás. Window Runtime specifikus alkalmazások megvalósítása. Giachetta Roberto

Concurrency in Swing

3. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése. Giachetta Roberto

1. Beadandó feladat dokumentáció

Task-alapú párhuzamosítás C# környezetben

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Window Runtime alapismeretek, Modern UI alapú alkalmazások.

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

2. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Java Programozás 11. Ea: MVC modell

2. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése II 3. előadás. Windows Forms alapismeretek, eseményvezérlés. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Window Runtime alapismeretek. Windows Runtime alapismeretek A Windows Runtime

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

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

BME MOGI Gépészeti informatika 13.

BME MOGI Gépészeti informatika 7.

Eseményvezérelt alkalmazások fejlesztése I 5. előadás. Grafikus felületű alkalmazások architektúrája. Grafikus felületű alkalmazások architektúrája

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

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése

OOP #14 (referencia-elv)

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

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

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

BME MOGI Gépészeti informatika 4.

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

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

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Programozási technológia

Eseménykezelés. Aszinkron kommunikáció

Objektumorientált programozás C# nyelven

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

2. Beadandó feladat dokumentáció

BME MOGI Gépészeti informatika 6.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 10. Előadás

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

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Webes alkalmazások fejlesztése 2. előadás. Kliens-szerver rendszerek megvalósítása (TCP/IP)

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

Szoftvertechnológia alapjai Java előadások

3. Beadandó feladat dokumentáció

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

Objektumorientált programozás C# nyelven

Grafikus felhasználói felület (GUI) létrehozása A GUI jelentése Egy egyszerű GUI mintaalkalmazás létrehozása

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

Swing GUI készítése NetBeans IDE segítségével

operációs rendszer A TinyOS - Bevezető - [ Beágyazott Információs Rendszerek Tervezése ]

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

C# osztályok. Krizsán Zoltán

Komponens alapú szoftverfejlesztés 8. előadás. Szoftver architektúrák alapvetései. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Eseményvezérelt alkalmazások fejlesztése II 2. előadás. Windows Forms alapismeretek, eseményvezérlés. Giachetta Roberto

2. Beadandó feladat dokumentáció

BME MOGI Gépészeti informatika 5.

Tervminták a valósidejű gyakorlatban

Java gyakorlat feladatai e s megolda sai ( )

Form1 Form Size 400;400 Text Mozgó kör timer1 Timer Enabled True Interval 100

Viczián István IP Systems JUM XIX szeptember 18.

Eseményvezérelt alkalmazások fejlesztése I 5. előadás. Grafikus felületű alkalmazások architektúrája

Programozási technológia

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

BME MOGI Gépészeti informatika 1.

Eseményvezérelt alkalmazások fejlesztése I 12. előadás. Összetett szoftver architektúrák. Giachetta Roberto

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Események C#-ban Krizsán Zoltán iit

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Általános szoftver architektúrák. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Elemi Alkalmazások Fejlesztése Beadandó Feladat Juhász Ádám

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

OOP: Java 8.Gy: Gyakorlás

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

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?

Előszó A Windows alkalmazásfejlesztés rövid története A Windows életútja A Windows 8 paradigmaváltása... 16

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

Mérési adatgyűjtés és adatfeldolgozás 2. előadás

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Eseménykezelés - Lottó játék

C# Szálkezelés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Szálkezelés / 21

Objektumorientált programozás C# nyelven III.

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

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

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

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

Eseményvezérelt alkalmazások fejlesztése II 2. előadás. Windows Forms alapismeretek, eseményvezérlés

Ügyviteli rendszerek hatékony fejlesztése Magic Xpa-val mobilos funkciókkal kiegészítve. Oktatók: Fülöp József, Smohai Ferenc, Nagy Csaba

Informatika terméktervezőknek

OOP és UML Áttekintés

BME MOGI Gépészeti informatika 15.

3. Beadandó feladat dokumentáció

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

Általános szoftver architektúrák

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése II 5. előadás Windows Forms alkalmazások párhuzamosítása Cserép Máté mcserep@inf.elte.hu http://mcserep.web.elte.hu Készült Giachetta Roberto jegyzete alapján http://www.inf.elte.hu/karunkrol/digitkonyv/

Szinkron és aszinkron tevékenységek A tevékenységek végrehajtásának két megközelítése van: szinkron: a tevékenység kezdeményezője megvárja annak lefutását a hívó szál blokkolódik, amíg a tevékenység lefut ha sokáig tart a tevékenység, akkor az a program felületén is észrevehető aszinkron: a tevékenység kezdeményezője nem várja meg a lefutást, illetve az eredményt a tevékenység (metódus) külön szálon fut az eredményt később megkapjuk (pl. eseményen át) a hívó szál nem blokkolódik, folytathatja a végrehajtást ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:2

Feladat: Készítsünk egy grafikus felületű alkalmazást Fibonacci számok számítására. a Fibonacci számot egy modell állítja elő (FibonacciGenerator), a generáláshoz (Generate) a klasszikus rekurzív képletet * használjuk: 1 ha n < 3 F n = ቊ F n 1 + F n 2 ha n 3 a grafikus felületen egy listában jelenítjük meg a számokat, és egy számbeállító segítségével szabályozzuk, hányadik számra vagyunk kíváncsiak * Valós környezetben a Fibonnaci számok a Binet formula segítségével konstans algoritmikus komplexitással előállíthatóak. ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:3

Megvalósítás (FibonacciGenerator.cs): public Int64 Generate(Int32 number) { if (number < 1) throw new ArgumentOutOfRangeException( ); if (number > 100) throw new ArgumentOutOfRangeException( ); if (number < 3) return 1; return Generate(number - 1) + Generate(number - 2); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:4

Aszinkron műveletek A grafikus felületű alkalmazások felépítésében fontos, hogy gyorsan reagáljunk a felhasználói interakcióra, a felhasználói felület mindig aktív legyen amennyiben egy nagyobb műveletet hajtunk végre, azt aszinkron módon, háttérben végezzük A háttérben futtatandó tevékenységek jelentős része (pl. fájlkezelés, hálózatkezelés) aszinkron műveletként is elérhetőek a.net 4.5 óta: ez a műveletek nevében jelzett (Async) pl.: StreamReader reader = ; reader.readlineasync(); // aszinkron olvasás ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:5

Aszinkron műveletek Az szinkron műveletek eredménye bevárható egy másik aszinkron műveletben aszinkron műveletet az async kulcsszóval hozhatunk létre aszinkron műveletet bevárni az await utasítással tudunk pl.: private async void ReadStreamAsync(Stream str) { StreamReader reader = new StreamReader(str); String line = await reader.readlineasync(); // aszinkron módon olvasunk, és megvárjuk // a művelet lefutását ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:6

Aszinkron tevékenységek megvalósítása Az aszinkron műveletek alapja a taszk (Task), amely biztosítja a párhuzamos futtatást a művelet tulajdonképpen taszkkal tér vissza, amely tartalmazhat eredményt is (Task<T>) amennyiben meg szeretnénk várni a művelet eredményét, taszkot kell megadni visszatérési értékként az aszinkronitást csak a megvalósításban kell jelölnünk, interfészben nem, csupán a taszk visszatérési értéket kell megadnunk szinkron művelet is futtatható aszinkron módon a Task.Run( ) művelete segítségével, amelynek lambda-kifejezést kell megadnunk ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:7

Aszinkron tevékenységek megvalósítása pl.: interface IAsyncInterface { Task ProcessAsync(); Task<Int32> ComputeAsync(); // aszinkron műveletek (visszatérési értékből látszik) async Task SomeMethod(IAsyncInterface asinst) { Int32 result = await asinst.computeasync(); // eredmény bevárása ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:8

Aszinkron tevékenységek megvalósítása class AsyncImplementation : IAsyncInterface { private void Process(); // szinkron művelet public async Task ProcessAsync() { await Task.Run(() => Process()); // a tevékenység aszinkron végrehajtása public async Task<Int32> ComputeAsync() { await Task.Run(() => { return value; ); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:9

Feladat: Készítsünk egy grafikus felületű alkalmazást Fibonacci számok számítására. a Fibonacci számot egy modell állítja elő (FibonacciGenerator), a generáláshoz (Generate) a klasszikus rekurzív képletet használjuk: 1 ha n < 3 F n = ቊ F n 1 + F n 2 ha n 3 lehetőséget adunk az aszinkron használatra is (GenerateAsync), lényegében egy taszkba burkoljuk a szinkron tevékenységet a felület így mindig aktív lesz, figyelmeztethetjük a felhasználót a tevékenységre ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:10

Aszinkron tevékenységek megszakítása Az aszinkron műveleteket végrehajtása adott esetben azok teljes befejezése előtt meg kívánjuk szakítani: a párhuzamos szál terminálása a háttér művelet inkonzisztens állapotban történő megszakításának kockázatával jár A taszk alapú aszinkron eljárások támogatják az abortálási igény detektálását és kezelését: var source = new CancellationTokenSource(); var token = source.token; var task = new Task(() => {..., token); megszakítási igény jelzése a taszkon kívülről: source.cancel(); megszakítási igény észlelése a taszkban: if(token.iscancellationrequested(){... ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:11

Feladat: Készítsünk egy grafikus felületű alkalmazást Fibonacci számok számítására. a Fibonacci számokat aszinkron módon egy modell állítja elő (FibonacciGenerator) a Run(n) metódussal, amely az első n Fibonnaci számot számítja ki egy új Fibonacci szám előállításakor kiváltjuk a NewResult eseményt, az utolsó, azaz az n. szám előllítását követően pedig a Ready eseményt is a számítás, azaz a Fibonacci számok előállítása megszakítható a Cancel() metóduson keresztül ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:12

Megvalósítás (MainForm.cs): private async void ButtonGenerate_Click( ) { // aszinkron lesz az eseménykezelő _button.text = "Generating... Please wait."; _listbox.items.insert(0, await _generator.generateasync( )); // megvárjuk a generálás eredményét _button.text = "Generate"; ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:13

Feladat: Készítsünk egy Tic-Tac-Toe programot, amelyben két játékos küzdhet egymás ellen. hatékonysági okokból valósítsuk meg aszinkron módon a teljes fájlkezelést, így az IPersistence interfész Load és Save műveletei taszkkal térnek vissza az ITicTacToeModel interfésze LoadGame és SaveGame műveletei is taszkkal térnek vissza minden esetben a megvalósításban aszinkron műveleteket készítünk, és aszinkron műveleteket hívunk ennek megfelelően minden felhasználáskor bevárjuk az eredményt ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:14

Tervezés: «interface» Persistence::IPersistence + LoadAsync(String) :Task<Player[]> + SaveAsync(String, Player[]) :Task Persistence::TextFilePersistence «async» + LoadAsync(String) :Task<Player[]> + SaveAsync(String, Player[]) :Task + NewGame() :void + SaveGame(String) :void «property» + CurrentPlayer() :Player + StepNumber() :Int32 «indexer» + this(int32, Int32) :Player «interface» Model::ITicTacToeModel «event» + GameStarted() :EventHandler + GameOver() :EventHandler + GameWon() :EventHandler<GameWonEventArgs> + FieldChanged() :EventHandler<FieldChangedEventArgs> «async» + StepGameAsync(Int32, Int32) :Task + LoadGameAsync(String) :Task ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:15

Megvalósítás (TextFilePersistence.cs): public async Task<Player[]> LoadAsync(String path) Byte[] filedata = await Task.Run(() => File.ReadAllBytes(path)); // fájl bináris tartalmának aszinkron // beolvasása return filedata.select(filebyte => (Player)fileByte).ToArray(); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:16

Párhuzamosítás időzítővel Az időzítés egy másik lehetséges formája az aszinkron tevékenység végrehajtásnak, amely a grafikus felülettől függetlenül is használható a System.Timers.Timer időzítővel kezelhető az intervallum (Interval), indítás és leállítás (Start, Stop), valamint az időzített esemény kiváltása (Elapsed) a System.Windows.Forms.Timer vezérlővel ellentétben párhuzamosan fut a háttérben, és nagyobb pontosságot garantál hátránya, hogy amennyiben grafikus felületű alkalmazással használjuk, szinkronizálást kell végeznünk a felülettel ez feloldható a vezérlő BeginInvoke műveletével, amely egy lambda-kifejezéssel megadott akciót (Action) tud futtatni a felület szálán ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:17

Párhuzamosítás időzítővel Pl.: Timers.Timer mytimer = new Timer(); // időzítő mytimer.elapsed += new ElapsedEventHandler(Timer_Elapsed); // időzített esemény void Timer_Elapsed( ){ // itt nem használhatjuk a felületet BeginInvoke(new Action(() => { // itt már igen mylabel.text = e.signaltime.tostring(); // kiírjuk az eltelt időt a felületre )); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:18

Feladat: Készítsünk egy vizsgatétel generáló alkalmazást kétrétegű architektúrában. a modell (ExamGeneratorModel) végzi a tételek generálását (Generate), amihez időzítőt használ, továbbá eseménnyel (NumberGenerated) jelzi, ha generált egy új számot emellett lehetőség van a tétel elfogadására (Take), illetve a korábban húzott tételek visszahelyezésére (Return) mindkét nézet kapcsolatban áll a modellel, a főablak az esemény hatására frissíti a megjelenítést (ügyelve a szinkronizációra) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:19

Tervezés: ExamGeneratorModel - _questioncount :Int32 - _periodcount :Int32 - _questionnumber :Int32 - _historylist :List<Int32> - _questiongenerator :Random - _timer :Timer + ExamGeneratorModel(Int32, Int32) + Generate() :void + Takeable(Int32) :Boolean + Take() :void + Return(Int32) :void - OnNumberGenerated() :void - Timer_Elapsed(object, ElapsedEventArgs) :void «property» + QuestionNumber() :Int32 + IsGenerating() :Boolean + QuestionCount() :Int32 + PeriodCount() :Int32 «event» + NumberGenerated() :EventHandler -_model -_model - _model :ExamGeneratorModel MainForm - _model :ExamGeneratorModel SettingsForm Form + MainForm() - Model_NumberGenerated(object, EventArgs) :void - ButtonStart_Click(object, EventArgs) :void - ButtonSet_Click(object, EventArgs) :void Form + SettingsForm(ExamGeneratorModel) - ButtonOk_Click(object, EventArgs) :void - ButtonCancel_Click(object, EventArgs) :void - NumericQuestionCount_ValueChanged(object, EventArgs) :void Program - Main() :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:20

Tervezés: MainForm ExamGeneratorModel User ButtonStart_Clicked() Generate() _timer.start() loop Timer_Elapsed() Model_NumberGenerated() OnNumberGenerated() ButtonStart_Clicked() Take() ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:21

Megvalósítás (MainForm.cs): public MainForm(){ _model = new ExamGeneratorModel(10, 0); _model.numbergenerated += new EventHandler(Model_NumberGenerated); // modell eseménye private void Model_NumberGenerated(object sender, EventArgs e){ BeginInvoke(new Action(() => { _textnumber.text = _model.questionnumber.tostring(); )); // szinkronizált végrehajtás ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 5:22