Programowanie urzdze mobilnych wykad IV KIS Pawe Fiderek
Programowanie urządzeń mobilnych – wykład IV KIS Paweł Fiderek
Zdarzenia public event Event. Handler<Event. Args> Bang; Bang(this, Event. Args. Empty);
Obsługa zdarzeń Null. Reference. Excepion. if (Bang != null) Bang(this, Event. Args. Empty);
Event. Handler<Event. Args> temp = Bang; if (temp != null) temp(this, Event. Args. Empty); Event. Handler<Event. Args> temp = Bang; if (temp != null) { var list = ev. Get. Invocation. List(); foreach (Event. Handler<Event. Args> d in list) { try { d. Invoke(this, Event. Args. Empty); } catch (Exception) { } } }
Wyjatki Wyjątki maja następujące własności: • wyjątki to typy, które dziedziczą z klasy System. Exception, • wyjątki, które mogą być zgłaszane należy objąć sekcja try, • wyjątki są zgłaszane przez stosowanie słowa kluczowego throw, • w momencie zgłoszenia wyjątku, kontrola sterownia jest przekazywana do pierwszej • obsługi wyjątku określonej słowem catch,
• jeśli nie ma obsługi zgłoszonego wyjątku, program zostaje zatrzymany i wyświetlany jest komunikat o błędzie, • nie należy przechwytywać wyjątku, który nie jest możliwy do obsłużenia i wprowadzenia, poprzez to aplikacja przechodzi w stan nieokreślony. • W przypadku przechwycenia System. Exception najlepiej zgłosić ten wyjątek ponownie na końcu bloku catch, • warto w bloku wyjątku podawać nie tylko typ wyjątku ale ta reprezentująca wyjątek może dostarczyć dodatkowych informacji o powodach wystąpienia sytuacji krytycznej,
• obiekty wyjątku zawierają szczegółowe informacje o błędzie, min. stan stosu wywołań oraz tekstowy opis błędu, • kod w sekcji finally jest wykonywany nawet w przypadku zgłoszenia wyjątku, blok finally warto stosować do zwalniana użytych zasobów, np. : zamykania otwartych strumieni i plików, • wyjątki zarządzane w platformie. NET są implementowane z użyciem struktury wyjątków Win 32/Win 64, jednak nie można ich traktować jako wyjątków systemowych.
try { … } catch(nazwa_wyjątku 1) { … }
catch(nazwa_wyjątku 2) { … } finalny { … }
class Pokaz { public static void Main() { int[] tablica = new int[10]; try { for (int i = 0; ; i++) { tablica[i] = i; Console. Write. Line(i); }} catch(Index. Out. Of. Range. Exception) { Console. Write. Line(„Nastąpiło właśnie przepełnienie indeksu”); }}}
Najczęstsze przyczyny rzucanych wyjątków • Arrary. Type. Mismatch. Exception – Typ wartości jaki chcemy przypisać jest niezgodny z typem docelowym • Divide. By. Zero. Exception – Próba dzielenia przez zero • Index. Out. Of. Range. Exception – Przekroczenie indeksu • Invalid. Cast. Exception – Niepoprawne rzutowanie w czasie rzeczywistym • Out. Of. Memory. Exception – Porażka wywołania new z powodu braku wolnej pamięci • Overflow. Exception – Arytmetyczne przepełnienie
Delegacje • Bardzo często spotkamy się w naszych programach z sytuacją, w której nasz program wykonuje jakieś działanie, ale nie wie jakich obiektów a nawet metod ma w tym celu użyć. Na przykład: naciśnięcie przycisku ma poinformować inny obiekt, że przycisk został przyciśnięty. Ale jaki to obiekt? Nie wiadomo, dlatego najlepszym rozwiązaniem jest połączenie tego przycisku z delegatem, który następnie w czasie wykonywania się programu wywoła odpowiednią metodę. • Możemy powiedzieć więcej, delegacje i zdarzenia są ściśle powiązane ze sobą, ponieważ delegat potrafi obsługiwać zdarzenie.
Konstrukcja delegacji public delegate typ name(params); Typ - typ zwracanej przez delegaturę wartości np. in, string lub void; Name - nazwa delegacji wykorzystywana potem do jej wywołania; Params – parametry delegatury, muszą być zgodne z parametrami funkcji której delegacja dotyczy;
Delegacje – przykład użycia public class Delegaty { public delegate int Moj. Delegat(int a, int b); public int Dodaj(int a, int b) { return a + b; }
public int Odejmij(int a, int b) { return a - b; } public int Pomnoz(int a, int b) { return a * b; } } public int Podziel(int a, int b) { return a / b; }
class Glowna { static void Main() { Delegaty d = new Delegaty(); Delegaty. Moj. Delegat dodawanie = new Delegaty. Moj. Delegat(d. Dodaj); int wynik. Dodawania = dodawanie(4, 6); System. Console. Write. Line("Wynik dodawania wynosi: {0}. ", wynik. Dodawania. To. String());
Delegaty. Moj. Delegat odejmowanie = new Delegaty. Moj. Delegat(d. Odejmij); int wynik. Odejmowania = odejmowanie(22, 11); System. Console. Write. Line("Wynik odejmowania wynosi: {0}. ", wynik. Odejmowania. To. String()); …………………………………… //analogicznie dla mnożenia i dzielenia }
Delegacje zdarzeń public delegate void Event. Handler(object sender, Event. Args e); public class Przycisk { public event Event. Handler Klikniecie; }
Wątki w Windows Mobile using System. Threading; ……………. private void proc() { ……………. } ……………… Thread name = new Thread(proc); …………. .
Klasa Thread - właściwości • • Is. Alive Is. Background Is. Thread. Pool. Thread Managed. Thread. Id Name Piority Thread. State
Klasa Thread - metody • • Abort() Interrupt() Join() Start()
Klasa Thread - właściwości statyczne • Current. Context • Current. Principal • Current. Thread
Klasa Thread - metody statyczne • • • Begin. Critical. Region() End. Critical. Region() Get. Domain. ID() Reset. Abort() Sleep() Spin. Wait() Volatile. Read() Volatile. Write()
Klasa Thread - Typ wyliczeniowy Thread. State • • Aborted Abort. Requested Background Running Stopped Stop. Requested Unstarted Wait. Sleep. Join
Priorytet wyjątków • • • Highest Above. Normal Below. Normal Lowest
Zastowanie teorii w praktyce przykłady
- Slides: 37