Wyjątki - wprowadzenie

Podobne dokumenty
Programowanie systemów czasu rzeczywistego laboratorium. Ćwiczenie 2. Temat zajęć: pakiety, zadania, synchronizacja czasowa, mechanizm spotkań

Ada-95. Dariusz Wawrzyniak

Wstęp do programowania 2

Język PL/SQL. Rozdział 3. Obsługa błędów wykonania Wyjątki predefiniowane i użytkownika, zgłaszanie i obsługa wyjątków.

Ada pakiety ogólna struktura

Ada95 przetwarzanie rozproszone

Ada95 przetwarzanie rozproszone

Pakiety podprogramów Dynamiczny SQL

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Oracle PL/SQL. Paweł Rajba.

Wstęp do programowania

Programowanie strukturalne

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

Programowanie współbieżne i rozproszone - Ada. EAIiE Katedra Automatyki

Język PL/SQL Pakiety podprogramów

Efekty uboczne błędów

Delphi Laboratorium 3

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

15. Funkcje i procedury składowane PL/SQL

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Wstęp do programowania 2

Język PL/SQL Procedury i funkcje składowane

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Procedury i funkcje składowane

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Ada 95 #1/5 - typy. Typy skalarne. Hierarchia typów w Adzie. Typ znakowy. Typy dyskretne. Plan wykładu

Październik Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

Oracle PL/SQL. Paweł Rajba.

Laboratorium 10 Temat: Zaawansowane jednostki testowe. Operacje na plikach. Funkcje.

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Wstęp do programowania 2

Mikroprocesor Operacje wejścia / wyjścia

Klasyfikacja wyjątków

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Wykład 8: Obsługa Wyjątków

Deklarowanie kursora

PODSTAWY BAZ DANYCH 13. PL/SQL

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Technologie baz danych WYKŁAD 7: Wyjątki

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Oracle Developer Suite. Budowa aplikacji użytkownika końcowego

Modelowanie złożonych układów cyfrowych (1)

Mechanizmy komunikacji. spotkania symetryczne (język CSP) spotkania asymetryczne (Ada) przestrzenie krotek (Linda) potoki, komunikaty i kanały (Unix)

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Bloki anonimowe w PL/SQL

Klasy cd. Struktury Interfejsy Wyjątki

1 Wprowadzenie do bloków nazwanych 1. 2 Parametry 2. 3 Procedury i funkcje 3. 4 Pakiety 6. 5 Podsumowanie Źródła 10

PL/SQL. Zaawansowane tematy PL/SQL

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

BAZY DANYCH W APLIKACJACH SIECIOWYCH

Wykład 4: Klasy i Metody

Układy reprogramowalne i SoC Język VHDL (część 4)

Wstęp do programowania

Zaawansowane bazy danych i hurtownie danych semestr I

TEMAT : KLASY DZIEDZICZENIE

DECLARE VARIABLE zmienna1 typ danych; BEGIN

OBSŁUGA WYJĄTKÓW. Mechanizm języka PL/SQL. Wyjątki:

Pojedyncze wartości zadeklarowanego typu Ustawiane przed rozpoczęciem symulacji bez moŝliwości

Klasy i obiekty cz II

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Programowanie w Turbo Pascal

PARADYGMATY PROGRAMOWANIA Wykład 4

1. ELEMENTY JĘZYKA PL/SQL

Przydział pamięci. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Elementy języka VHDL. obiekty typy danych atrybuty pakiety i biblioteki instrukcje współbieżne instrukcje sekwencyjne. PUE-w3 1

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

Materiały do laboratorium MS ACCESS BASIC

Wstęp do programowania 2

Programowanie obiektowe

kiedy znowu uzyska sterowanie, to podejmuje obliczenie od miejsca, w którym poprzednio przerwała, i z dotychczasowymi wartościami zmiennych,

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Dawid Gierszewski Adam Hanasko

Multimedia JAVA. Historia

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Programowanie obiektowe

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Współbieżność w środowisku Java

Podstawy Programowania semestr drugi. Wykład czternasty

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Programowanie obiektowe

Metody Metody, parametry, zwracanie wartości

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

LibreOffice Calc VBA

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Transkrypt:

Wyjątki - wprowadzenie Wymaganie nieprzerwanego działania jest dla systemów czasu rzeczywistego podstawowe. Wszelkie nietypowe sytuacje, w których znajduje się program, muszą być obsłużone, po czym działanie powinno być kontynuowane. Podstawową konstrukcją, stosowaną przy programowaniu opisanych sytuacji jest mechanizm wyjątków. Wyjątki (exceptions) określają sytuacje stany programu, w których należy podjąć szczególne (wyjątkowe) akcje. Momenty wystąpienia wyjątków nie są określone, a ponadto po zgłoszeniu wyjątku powinna być podjęta odpowiednia obsługa. Często wyjątki utożsamiane są z przerwaniami programowymi. W języku Ada wyróżnia się 2 etapy dotyczące wyjątku: Zgłoszenie wyjątku predefiniowanego lub określonego w programie (instrukcja raise). Obsługa wyjątku (pierwszego i drugiego rodzaju). Każdy wyjątek, poza predefiniowanymi, powinien być zadeklarowany przez programistę. Po zgłoszeniu wyjątku poszukiwany jest segment obsługi i, jeśli nie zostanie znaleziony w najbliższym kontekście, jest poszukiwany dynamicznie w szerszym obszarze (propagacja wyjątku). Jeśli segment nie zostanie znaleziony, to program zostanie zakończony. 1

Wyjątki predefiniowane Wyjątki predefiniowane są zadeklarowane w odpowiednich pakietach. Stąd, w zależności od dołączonych pakietów, w programie może być zadeklarowanych wiele wyjątków, wraz z instrukcjami zgłaszania wyjątku wstawianymi w miejscach dopowiadających sytuacjom wymagającym obsługi. Deklaracje i zgłoszenia wyjątków są dołączane wtedy automatycznie do kodu kompilowanego programu, natomiast obsługa predefiniowanych wyjątków musi być opisana przez programistę. Istnieje możliwość wyłączenia, za pomocą pragmy Suppress, niektórych sprawdzeń dotyczących wyjątków predefiniowanych. Poprawia to efektywność kodu, ale z drugiej strony zwiększa ryzyko niepoprawnego działania programu. 2

Wyjątki predefiniowane Podstawowe cztery wyjątki są zadeklarowane w pakiecie Standard: Constraint_Error przekroczenie zakresu Parametr aktualny in/in out jest wskaźnikiem i ma wartość null Drugi parametr operacji: /, mod, rem jest równy 0 Wartość indeksu tablicy jest poza zakresem danego typu Wartość skalarna przekroczyła zakres bazowy swojego typu Program_Error niewłaściwa sytuacja w strukturze sterującej Wywołanie niedostępnego elementu Wywołanie podprogramu lub wejścia do obiektu chronionego, którego deklaracja nie została jeszcze opracowana Osiągnięcie end w funkcji niewykonanie return. Storage_Error brak pamięci do opracowania deklaracji lub wykonania instrukcji (np. obliczenie wskaźnika). Tasking_Error komunikacja z zadaniem jest niemożliwa (zadanie zostało usunięte). 3

Deklarowanie i zgłaszanie wyjątków - przykład package Stack is Error: exception; -- Error jest nazwą wyjątku procedure Push(X:Integer); function Pop return Integer; end Stack; 4

Deklarowanie i zgłaszanie wyjątków - przykład Instrukcja zgłoszenia wyjątku składa się ze słowa kluczowego raise i ewentualnie nazwy wyjątku. Nazwa identyfikuje zgłaszany wyjątek, natomiast brak nazwy (wyłącznie raise) oznacza wymuszenie propagacji wyjątku przez programistę. package body Stack is Size: constant := 100; A: array(1..size) of Integer; Top: Integer range 0..Size; procedure Push(X: Integer) is begin If Top = size then raise Error; -- zgłoszenie wyjątku end if; Top:=Top + 1; A(Top):=X; end Push; function Pop return Integer is begin if Top = 0 then raise Error; -- zgłoszenie wyjątku Top:= Top - 1; return A(Top+1); end Pop; begin Top:=0; -- nadanie wartości początkowej end Stack; 5

Obsługa wyjątków declare use Stack; begin Push(M); --... K:=Pop; --... -- Strefa obsługi wyjątków: exception when Error => -- obsługa wyjątku Error when others => -- obsługa wszystkich innych wyjątków end; 6

Obsługa wyjątków Strefa obsługi wyjątków, jeśli występuje, powinna być umieszczona na końcu danej jednostki (bloku, podprogramu, zadania). Strefa składa się z segmentów obsługi wyjątków, z których każdy definiuje obsługę dla jednego lub kilku wyjątków. Po słowie kluczowym when definiuje się wyjątki, dla których określa się obsługę. Po dwuznaku => umieszcza się instrukcje realizujące te obsługę Wyjątki można określić przez ich nazwy (por. Error) Pozostałe wyjątki, które wystąpiły w danym kontekście określa się przez słowo kluczowe others. Faza others powoduje obsłużenie wyjątków (jeśli wystąpiły): Predefiniowanych Nazwanych w danym kontekście, lecz nie obsłużonych w innych segmentach Propagowanych z jednostek dynamicznie zagnieżdżonych w bloku, w którym nastąpił segment obsługi others. Segment others, jeśli jest stosowany, musi wystąpić w strefie obsługi wyjątków jako ostatni. 7

Obsługa wyjątków Obsługa zgłaszanego wyjątku jest najpierw poszukiwana w najbliższym kontekście jego wystąpienia, czyli na końcu jednostki, w której zgłoszenie wystąpiło. Jeśli zostanie znaleziony odpowiedni segment, to następuje skok i wykonywane są instrukcje obsługi zawarte w tym segmencie. Jeśli obsługa zakończy się i występują jeszcze inne nie obsłużone wyjątki, to poszukiwane są dalsze segmenty. Kiedy zakończy się obsługa wszystkich wyjątków, kończy się wykonywanie danej jednostki (blok, podprogram, zadanie). W konsekwencji, jeśli obsługa wyjątku znajduje się na końcu zadania, to po wystąpieniu wyjątku i zakończeniu jego obsługi, zadanie takie zostanie zakończone i może być usunięte. W związku z tym definiuje się dodatkowy blok wewnętrzny w zadaniu, w którym będzie umieszczana strefa obsługi wyjątków. Wykonanie obsługi spowoduje wówczas jedynie zakończenie bloku, co umożliwi kontynuację wykonywania zadania. 8

Propagacja wyjątków Zgłoszenie wyjątku powoduje przekazanie sterowania do strefy zawierającej segment obsługi wyjątku w bloku, w którym nastąpiło zgłoszenie. Brak segmentu obsługi powoduje automatyczne zgłoszenie wyjątku w bloku dynamicznie otaczającym. Ponowne zgłoszenie nazywa się propagacją wyjątku. Propagacja trwa, dopóki segment obsługi nie zostanie znaleziony. Jeśli poszukiwanie się nie powiedzie, to program przechodzi do fazy zakończenia z komunikatem Program_Error. Programista może wymusić propagację wyjątku w trakcie jego obsługi przez użycie instrukcji raise. Pozwala to obsługiwać ten sam lub inny wyjątek na wielu poziomach, tzn. przez wiele dynamicznie zagnieżdżonych jednostek programowych. Propagacja odbywa się na zewnątrz do obszaru dynamicznie otaczającego: Przy wywołaniu podprogramów w stronę jednostek wywołujących W przypadku zadań w kierunku zadań macierzystych powołujących zadanie Wymuszona przez programistę propagacja wyjątków służy do grupowania wyjątków na określonych poziomach w celu łatwiejszego zarządzania i zwiększenia czytelności. 9

Propagacja wyjątków - przykład exception when Error => Put_Line( Overflow or underflow of stack ); Re_Arrange_Stack; raise Stack_Error; when others => put_line( Another error ); --... raise; end; 10

Wielokrotne zgłaszanie wyjątku - przykład procedure Recurr(N: in Integer) is Exc: exception; begin if N=0 then raise Exc; else Recurr(N-1); end if; exception when Exc => Put_line("Bad parameter value"); raise; when others => null; end Recurr; 11

Zaawansowana obsługa wyjątków pakiet Ada.Exceptions package Ada.Exceptions is type Exception_Id is private; Null_Id : constant Exception_Id; function Exception_Name(Id : Exception_Id) return String; type Exception_Occurrence is limited private; type Exception_Occurrence_Access is access all Exception_Occurrence; Null_Occurrence: constant Exception_Occurrence; 12

Zaawansowana obsługa wyjątków pakiet Ada.Exceptions procedure Raise_Exception (E : in Exception_Id; Message : in String := ""); function Exception_Message (X : Exception_Occurrence) return String; procedure Reraise_Occurrence(X : in Exception_Occurrence); function Exception_Identity (X : Exception_Occurrence) return Exception_Id; function Exception_Name (X : Exception_Occurrence) return String; function Exception_Information (X : Exception_Occurrence) return String; procedure Save_Occurrence (Target : out Exception_Occurrence; Source : in Exception_Occurrence); function Save_Occurrence(Source : Exception_Occurrence) return Exception_Occurrence_Access; private... end Ada.Exceptions; 13

Zaawansowana obsługa wyjątków przykład when Event: others => Put_Line( Unexpected exception ); Put_Line(Exception_Name(Event)); Put(Exception_Message(Event)); raise; end; 14

Obsługa wyjątków pełny przykład -- Pakiet implementujący stos: package Stack is Error: exception; procedure Push(X:Integer); function Pop return Integer; end Stack; 15

Obsługa wyjątków pełny przykład -- Implementacja pakietu: package body Stack is size: constant := 5; A: array(1..size) of Integer; Top: Integer range 0..Size; procedure Push(X: Integer) is begin if Top = size then raise Error; -- zgloszenie wyjatku end if; Top:=Top + 1; A(Top):=X; end Push; function Pop return Integer is begin if top = 0 then raise Error; -- zgloszenie wyjatku end if; Top:= Top - 1; return A(Top+1); end Pop; begin top:=0; end Stack; 16

Obsługa wyjątków pełny przykład with Ada.Text_IO; use Ada.Text_IO; with ada.integer_text_io; use ada.integer_text_io; with Ada.Float_Text_IO; use Ada.Float_Text_IO; with stack; use Stack; procedure Main is procedure Reset is -- opróżnianie stosu Junk: Integer; begin loop Junk:=Pop; New_Line; Put("Usiwam wartosc:"); Put(Junk); end loop; exception when Error => null; end Reset; begin for I in 1..12 loop Push(I); end Loop; exception when Error => Put("Błąd użycia stosu"); Reset; when others => Put("Inne blędy"); end Main; 17

Wyjątki w różnych fazach programu Wyjątki w trakcie opracowywania deklaracji. Zgłoszenie wyjątku powoduje, że obiekt nie zostaje utworzony. Zadania tworzone w części deklaracyjnej nie zostaną aktywizowane i przejdą w fazę zakończenia lub usuwania. Wyjątki w czasie aktywacji zadania. Po zgłoszeniu wyjątku zadanie przechodzi do fazy zakończenia, ponieważ nie jest w stanie obsłużyć wyjątku. Powoduje to zgłoszenie wyjątku Tasking_Error w zadaniu rodzica po zakończeniu aktywacji wszystkich zadań potomnych. Wyjątki w czasie zakończenia zadania. Wyjątki są tracone (nieobsługiwane). Wyjątki w trakcie realizacji spotkania nie są obsługiwane i propagowane. Dodatkowo mogą zostać zgłoszone wyjątki w trakcie przystępowania do spotkania: Tasking_Error gdy klient wywołuje zadanie serwera, które znajduje się w trakcie zakończenia, usuwania, lub jest argumentem wykonywanej instrukcji abort. Constraint_Error gdy klient wywołuje element rodziny wejść i aktualny indeks tego wejścia jest poza zakresem. Program_Error gdy serwer wykonuje instrukcję select i wszystkie rozgałęzienia tej instrukcji są zamknięte, a instrukcja nie ma części else. Wyjątki w trakcie użycia obiektów chronionych 18

Wyjątki w różnych fazach programu Wyjątki w trakcie użycia obiektów chronionych. Program_Error jest zgłaszany przy interakcji zadania z obiektem chronionym w następujących przypadkach: Obliczanie warunków barier prowadzi do zgłoszenia wyjątku, który jest zgłaszany we wszystkich zadaniach oczekujących w kolejce do danego wejścia; W obiekcie chronionym wykonywana jest operacja potencjalnie blokująca (wcześniejszy wykład); Zadanie umieszczone w kolejce do wejścia obiektu chronionego jest zakończone. Constraint_Error jest zgłaszany, jeśli aktualna wartość indeksu wejścia jest poza zakresem. Wyjątki w trakcie obsługi przerwań propagowane z jednostek obsługujących przerwania (procedura chroniona, zadanie) nie powodują żadnego efektu. Wyjątki względem odroczonych operacji abort (w dalszej części wykładu). Wyjątki w trakcie asynchronicznej instrukcji select (w dalszej części wykładu). 19

Instrukcja abort Instrukcja abort umożliwia bezwarunkowe zakończenie specyfikowanego zadania. Zadanie będące argumentem instrukcji abort uzyskuje statut abnormal; również wszystkie inne zależne od niego niezakończone zadania uzyskują ten sam statut. Zadanie, które uzyskało statut abnormal jest usuwane, jeśli nie było zaangażowane w wykonywanie operacji odroczonych względem abort. Instrukcja abort jest faktycznie wykonywana, jeśli dane zadanie dochodzi do następujących punktów (poza operacjami odroczonymi): Zakończenie aktywacji zadania; Rozpoczęcie aktywacji zadania; Początek lub zakończenie wołania wejścia, instrukcji select, opóźnienia lub abort; Początek wykonywania instrukcji select lub sekwencji instrukcji obsługi wyjątku. W konsekwencji zadanie w stanie abnormal nie musi być zakończone o ile nie zastosuje się przeterminowania zakończenia instrukcji abort (stosując mechanizmy dostępne w w aneksie C) 20

Instrukcja abort Operacje odroczone względem abort to: Operacje chronione; Oczekiwanie na zakończenie wołania wejścia; Oczekiwanie na zakończenie zadań zależnych; Wykonywanie procedur inicjalizacji lub zakończenia, lub instrukcji przypisania obiektu z częścią sterowaną. 21

Obsługa przerwań z zastosowaniem języka Ada Specyfikacja obsługi przerwań w języku Ada95 umieszczona została w aneksie C. Przerwania w języku Ada83 zawarto w standardzie języka. Wystąpienie przerwania generowanego przez sprzęt lub oprogramowanie sterowników sprzętu nie jest przekazywane natychmiast do obsługi (następuje opóźnienie, którego wartość powinna być dla systemów czasu rzeczywistego oszacowana). Po dotarciu i rozpoznaniu przerwania podejmowana jest przypisana mu obsługa (definiowana przez programistę), lub obsługa domyślna (określana na poziomie implementacji środowiska wykonawczego). W języku Ada95 obsługa przypisana jest bezparametrową procedurą chronioną procedurą obiektu chronionego i powinna być określana jako obsługa przerwania z zastosowaniem pragmy Interrupt_Handler. 22

Specyfikacja procedury obsługi przerwania w języku Ada95 protected Treat_Interrupt is procedure Reaction; -- procedura bezparametrowa! pragma Interrupt_Handler(Reaction); -- Reaction jest procedurą obsługi przerwania pragma Attach_Handler(Reaction, Interrupt); -- dołączenie przerwania Interrupt do procedury -- jego obsługi Reaction -- Można dynamicznie powiązać procedurę przerwania z danym -- przerwaniem z zastosowaniem funkcji Attach_Handler -- (pakiet Ada.Interrupts) end Treat_Interrupt; 23

Pakiet Ada.Interrupts with System; package Ada.Interrupts is pragma Suppress( Elaboration_Check ); type Interrupt_Id is zależy od implementacji type Parameterless_Handler is access protected procedure; function Is_Reserved (Interrupt : Interrupt_Id) return Boolean; function Is_Attached (Interrupt : Interrupt_Id) return Boolean; function Current_Handler (Interrupt : Interrupt_Id) return Parameterless_Handler; procedure Attach_Handler (New_Handler : Parameterless_Handler; Interrupt : Interrupt_Id); procedure Exchange_Handler (Old_Handler : out Parameterless_Handler; New_Handler : Parameterless_Handler; Interrupt : Interrupt_Id); procedure Detach_Handler (Interrupt : Interrupt_Id); function Reference(Interrupt: Interrupt_Id) return System.Address; end Ada.Interrupts; 24

Asynchroniczna zmiana wątku sterowania odtwarzanie po błędzie -- Obiekt chroniony rozsyłający komunikaty do wszystkich -- zadań oczekujących na wystąpienie sygnału: package Broadcasting is type Message is (Error1,Error2,Error3); -- dostępne sygnały protected type Broadcast is procedure Send(The_Message: Message); -- wysłany sygnał entry Receive(A_Message: out Message); -- wszystkie zadania oczekujące na Receive -- otrzymają wiadomość private Message_Arrived: Boolean:=False; W_Message: Message; end Broadcast; end Broadcasting; 25

Asynchroniczna zmiana wątku sterowania odtwarzanie po błędzie -- Implementacja obiektu chronionego package Body Broadcasting is protected body Broadcast is procedure Send(The_Message: Message) is begin if Receive'Count > 0 then Message_Arrived:=True; W_Message:=The_Message; end if; end Send; entry Receive(A_Message: out Message) when Message_Arrived is begin if Receive'Count = 0 then Message_Arrived:=False; end if; A_Message:=W_Message; end Receive; end Broadcast; end Broadcasting; 26

Asynchroniczna zmiana wątku sterowania odtwarzanie po błędzie with Ada.Text_IO; use Ada.Text_IO; with Calendar; use Calendar; with Broadcasting; use Broadcasting; procedure Main is Error_Raised: Broadcast; task Err_Monitor; task Recovery_Task; task body Err_Monitor is Error: Message; begin loop Put("Rozpoczęro obliczenia Err_Monitor"); New_Line; delay 7.0; Error:=Error1; Put("Wyslano kod bledu"); New_Line; Error_Raised.Send(Error); end loop; end Err_monitor; 27

Asynchroniczna zmiana wątku sterowania odtwarzanie po błędzie task body Recovery_Task is Reason: Message; begin Put("Rozpoczęto obliczenia Recovery_Task"); New_Line; delay 0.5; loop select Error_Raised.Receive(Reason); case Reason is when Error1 => Put("Naprawa po błędzie Error1"); New_Line; when Error2 => Put("Naprawa po błędzie Error2"); New_Line; when Error3 => Put("Naprawa po błędzie Error3"); New_Line; end case; then abort loop Put("Wykonywane są onliczenia"); New_Line; delay 1.0; end loop; end select; end loop; end Recovery_Task; 28 begin null;end Main;

Asynchroniczna zmiana wątku sterowania zmiana trybu zadania -- obiekt chroniony implementujący semafor package Per_Sig is protected type Persistent_Signal is entry Wait; procedure Signal; private Arised: Boolean := False; end Persistent_Signal; end Per_Sig; 29

Asynchroniczna zmiana wątku sterowania zmiana trybu zadania -- implementacja obiektu chronionego package body Per_Sig is protected body Persistent_Signal is entry Wait when Arised is begin Arised := False; -- wystąpienie zdarzenia jest "skonsumowane" end Wait; procedure signal is begin Arised:=True; end Signal; end Persistent_Signal; end Per_sig; 30

Asynchroniczna zmiana wątku sterowania zmiana trybu zadania with Ada.Text_IO; use Ada.Text_IO; With Calendar; use Calendar; with Per_Sig; use Per_Sig; procedure Main is type Mode is (Critical,Normal); Change: Persistent_Signal; task Change_Mode; task Two_Modes_Task; task body Change_Mode is begin Put("Start Change_Mode "); loop delay 4.0; New_Line; Put("Zmiana trybu pracy zadania Two Modes"); New_Line; Change.Signal; end loop; end Change_Mode; 31

Asynchroniczna zmiana wątku sterowania zmiana trybu zadania task body Two_Modes_Task is Current_Mode: Mode:=Normal; Next_Time: time:=clock; Critical_Period: constant Duration := 0.2; Normal_Period: constant Duration:= 1.0; Current_Period: Duration:=Normal_Period; begin loop select Change.Wait; if Current_Mode=Critical then Current_Mode:=Normal; Current_Period:= Normal_Period; else Current_Mode := Critical; Current_Period:=Critical_Period; end if; then abort loop Put( Zad Two_Modes Liczy");New_Line; Next_Time:=Next_Time+Current_Period; delay until Next_Time; end loop; end select; end loop; end two_modes_task; begin null; end; 32

Asynchroniczna zmiana wątku sterowania przeterminowanie obliczeń with Calendar; use Calendar; task Comp_Timeout; task body Comp_Timeout is Timeout: Duration:= 0.5; begin... select delay Timeout;... - obsługa po przeterminowaniu then abort... - blok krytyczny czasowo end select;... end Comp_Timeout; 33