|
|
# Cvičenie 10
|
|
|
|
|
|
Dnešnou úlohou bude vytvoriť nástroj na zobrazenie aktuálneho počasia.
|
|
|
|
|
|
Tabuľka je dostupná na http://www.shmu.sk/sk/?page=59
|
|
|
|
|
|
(vytvorte si nový projekt)
|
|
|
|
|
|
## HTTP Get & Singleton
|
|
|
|
|
|
Vytvorte si triedu Weather, nech táto trieda obsahuje informácie reprezentujúce jeden záznam z tabuľky.
|
|
|
|
|
|
Vytvorte si rozhranie IHtmlProvider, toto rozhranie nám bude slúžiť dnes len pre jednu triedu - ktorá cez HTTP načíta stránku a predá ju ďalej (v praxi by mohlo túto stránku získať aj inak, napr. načítať z disku, prípadne použiť iný protokol ako HTTP).
|
|
|
|
|
|
Nech toto rozhranie obsahuje jednu metódu `string LoadHtml(string url)`
|
|
|
|
|
|
Na tomto mieste by sa žiadalo použiť async programovanie, jeho problém je však, že ak ho raz použijete, už sa bude ťahať cez celý kód. O tom, ako to si môžete prečítať viac tu: [async concepts](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/)
|
|
|
|
|
|
V rámci cvičenia si to ale ukážeme cez klasické vlákna.
|
|
|
|
|
|
1. Vytvorte si triedu WebPageProvider, nech táto trieda implementuje IHtmlProvider
|
|
|
2. Implementujte rozhranie. [Ako na HTTP](https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.8) - použite GET
|
|
|
3. Nech táto trieda implementuje [návrhový vzor Singleton] (https://en.wikipedia.org/wiki/Singleton_pattern):
|
|
|
1. (všetko v rámci triedy)
|
|
|
2. potrebujeme explicitne deklarovaný _private_ konštruktor
|
|
|
3. potrebujeme _private static_ referenciu na objekt danej triedy
|
|
|
4. `public static IHtmlProvider GetInstance()` nech pri prvom zavolaní vytvorí nový objekt a uloží ho, potom vráti. Pri ďalších zavolaniach nech už len vráti tento vytvorený objekt.
|
|
|
4. Vytvorte triedu WeatherParser s jedným parametrickým konštruktom - vstupom bude parameter typu IHtmlProvider. Pridajte metódu `void Parse(string source, Form form, EventHandler handler)` kde získate z IHtmlProvider stránku a pomocou Regexov nájdite a rozdeľte získanú tabuľku a vytvorte z nej zoznam s aktuálnym počasím v daných staniciach.
|
|
|
5. Pridajte si event, ktorý sa zavolá, keď bude všetko pripravené, aby aktualizoval UI prvky
|
|
|
1. Tento raz však budeme pracovať s dvoma vláknami, čo spôsobuje jeden problém: Zmena UI elementov je možná len v hlavnom vlákne, musíme teda nejakým spôsobom zabezpečiť, aby sa kód vykonal v správnom vlákne.
|
|
|
6. Pridajte na formulár tlačidlo Load, ktoré zabezpečí načítanie a parsovanie v osobitnom vlákne
|
|
|
|
|
|
```csharp
|
|
|
//method signature
|
|
|
object Control.Invoke(Delegate method, params object[] args)
|
|
|
|
|
|
//použitie v prípade volania z iného vlákna
|
|
|
form.Invoke(handler, sender, arg1, arg2, arg3, arg4);
|
|
|
```
|
|
|
|
|
|
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/params
|
|
|
|
|
|
Použite ListBox na zobrazenie menu na výber mesta. Ako na to: https://www.c-sharpcorner.com/UploadFile/mahesh/listbox-in-C-Sharp/
|
|
|
|
|
|
Zabezpečte zobrazenie pre dané mesto pomocou vhodných prvkov. Pri zmene výberu nezabudnite aktualizovať.
|
|
|
|
|
|
Ako bonusovú úlohu sa pokúste v rámci nového projektu urobiť to isté, ale použite `async / await` toto si bude vyžadovať zmeny v štruktúre kódu, v tomto prípade ale nepotrebujeme explicitne použit vlákna.
|
|
|
|
|
|
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/ |
|
|
\ No newline at end of file |