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

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

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

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

3. Beadandó feladat dokumentáció

Concurrency in Swing

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

1. Beadandó feladat dokumentáció

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ó

2. Beadandó feladat dokumentáció

Java Programozás 11. Ea: MVC modell

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

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

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

BME MOGI Gépészeti informatika 13.

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

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

BME MOGI Gépészeti informatika 7.

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

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

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)

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

BME MOGI Gépészeti informatika 4.

OOP #14 (referencia-elv)

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

// 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 )

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

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

Programozási technológia

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

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

Eseménykezelés. Aszinkron kommunikáció

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

Objektumorientált programozás C# nyelven

Szoftvertechnológia alapjai Java előadások

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

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

2. Beadandó feladat dokumentáció

BME MOGI Gépészeti informatika 6.

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

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

3. Beadandó feladat dokumentáció

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

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

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

Objektumorientált programozás C# nyelven

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

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

Tervminták a valósidejű gyakorlatban

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

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

2. Beadandó feladat dokumentáció

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

Java gyakorlat feladatai e s megolda sai ( )

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

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

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

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

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

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

BME MOGI Gépészeti informatika 5.

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

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

Alkalmazott Modul III 6. gyakorlat. Objektumorientált programozás: öröklődés és polimorfizmus

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ási technológia

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

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

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

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

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

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

3. Beadandó feladat dokumentáció

Általános szoftver architektúrák

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

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

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

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

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

Eseményvezérelt alkalmazások fejlesztése II 3. előadás. Windows Forms dinamikus felhasználói felület, elemi grafika

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

BME MOGI Gépészeti informatika 1.

Programozási Paradigmák és Technikák

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Objektumorientált programozás C# nyelven III.

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

OOP: Java 8.Gy: Gyakorlás

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

BME MOGI Gépészeti informatika 15.

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

Ü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

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

Informatika terméktervezőknek

OOP és UML Áttekintés

Á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 Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

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

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:11

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:12

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:13

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:14

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:15

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:16

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:17

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:18

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:19

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:20