370 likes | 479 Views
Programowanie urządzeń mobilnych – wykład IV. KIS Paweł Fiderek. Zdarzenia. public event EventHandler<EventArgs > Bang;. Bang( this , EventArgs.Empty );. Obsługa zdarzeń. NullReferenceExcepion. if (Bang != null) Bang(this, EventArgs.Empty );. EventHandler < EventArgs > temp = Bang;
E N D
Programowanie urządzeń mobilnych – wykład IV KIS Paweł Fiderek
Zdarzenia public eventEventHandler<EventArgs> Bang; Bang(this, EventArgs.Empty);
Obsługa zdarzeń NullReferenceExcepion. if (Bang != null) Bang(this, EventArgs.Empty);
EventHandler<EventArgs> temp = Bang; if (temp != null) temp(this, EventArgs.Empty); EventHandler<EventArgs> temp = Bang; if (temp != null) { var list = ev.GetInvocationList(); foreach (EventHandler<EventArgs> d in list) { try { d.Invoke(this, EventArgs.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 Win32/Win64, jednak nie można ich traktować jako wyjątków systemowych.
try { … } catch(nazwa_wyjątku1) { … }
catch(nazwa_wyjątku2) { … } finalny { … }
class Pokaz { public staticvoidMain() { int[] tablica = newint[10]; try { for (int i = 0; ; i++) { tablica[i] = i; Console.WriteLine(i); }} catch(IndexOutOfRangeException) { Console.WriteLine(„Nastąpiło właśnie przepełnienie indeksu”); }}}
Najczęstsze przyczyny rzucanych wyjątków • ArraryTypeMismatchException – Typ wartości jaki chcemy przypisać jest niezgodny z typem docelowym • DivideByZeroException – Próba dzielenia przez zero • IndexOutOfRangeException – Przekroczenie indeksu • InvalidCastException – Niepoprawne rzutowanie w czasie rzeczywistym • OutOfMemoryException – Porażka wywołania new z powodu braku wolnej pamięci • OverflowException – 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 delegatetypname(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 classDelegaty { public delegateintMojDelegat(int a, int b); public intDodaj(int a, int b) { return a + b; }
public intOdejmij(int a, intb) { return a - b; } public intPomnoz(int a, int b) { return a * b; } public int Podziel(int a, int b) { return a / b; } }
classGlowna { staticvoidMain() { Delegaty d = newDelegaty(); Delegaty.MojDelegat dodawanie = newDelegaty.MojDelegat(d.Dodaj); intwynikDodawania = dodawanie(4, 6); System.Console.WriteLine("Wynik dodawania wynosi: {0}.", wynikDodawania.ToString());
Delegaty.MojDelegat odejmowanie = newDelegaty.MojDelegat(d.Odejmij); intwynikOdejmowania = odejmowanie(22, 11); System.Console.WriteLine("Wynik odejmowania wynosi: {0}.", wynikOdejmowania.ToString()); ……………………………………………………………………… //analogicznie dla mnożenia i dzielenia }
Delegacje zdarzeń public delegatevoidEventHandler(objectsender, EventArgs e); public classPrzycisk { public eventEventHandler Klikniecie; }
Wątki w Windows Mobile usingSystem.Threading; …………………………. privatevoidproc() { ……………. } ……………… Threadname= newThread(proc); ……………………..
Klasa Thread - właściwości • IsAlive • IsBackground • IsThreadPoolThread • ManagedThreadId • Name • Piority • ThreadState
Klasa Thread - metody • Abort() • Interrupt() • Join() • Start()
Klasa Thread - właściwości statyczne • CurrentContext • CurrentPrincipal • CurrentThread
Klasa Thread - metody statyczne • BeginCriticalRegion() • EndCriticalRegion() • GetDomain() • GetDomainID() • ResetAbort() • Sleep() • SpinWait() • VolatileRead() • VolatileWrite()
Klasa Thread - Typ wyliczeniowy ThreadState • Aborted • AbortRequested • Background • Running • Stopped • StopRequested • Unstarted • WaitSleepJoin
Priorytet wyjątków • Highest • AboveNormal • Normal • BelowNormal • Lowest