Programowanie w środowiskach RAD Język C++ w środowiskach RAD



Podobne dokumenty
Podstawy programowania w języku C dla środowiska Windows

IFiZR Laboratorium 5 Info

Komunikaty w Windows. Jarosław Kuchta

Programowanie na poziomie sprzętu. Programowanie w Windows API

Podstawy programowania w języku C dla środowiska Windows

PROE wykład 8 Interfejs użytkownika (GUI) dr inż. Jacek Naruniec

Programowanie w języku C++ z użyciem Windows API

Procedura okna: LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);

1 Podstawy c++ w pigułce.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Cechy systemu X Window: otwartość niezależność od producentów i od sprzętu, dostępny kod źródłowy; architektura klient-serwer;

Język programowania. Andrzej Bobyk

Zegary. Zegary (timers) umożliwiają cykliczne w danych odstępach czasu wykonać określone operacje.

Programowanie MorphX Ax

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

Mechanizmy pracy równoległej. Jarosław Kuchta

Podstawowy projekt OpenGL utworzony przy użyciu środowisk programistycznych firmy Microsoft.

1 Podstawy c++ w pigułce.

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

Podstawy programowania

Deduplikacja danych. Zarządzanie jakością danych podstawowych

PROGRAMOWANIE W SYSTEMIE WINDOWS

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Podstawy programowania komputerów

Programowanie w środowiskach RAD Qt i C++

76.Struktura oprogramowania rozproszonego.

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Twisted. Silnik Twojego Internetu. Jan Urbański Ducksboard. PyWaw #25, Warszawa, 10 czerwca 2013

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Wstęp do programowania

Wprowadzenie do programowania w Windows

Laboratorium Grafiki Komputerowej i Animacji. Ćwiczenie I. Wprowadzenie do programowania w Windows

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Architektura interfejsu użytkownika

Podstawy Programowania Podstawowa składnia języka C++

Co to jest NODE.JS? Nowoczesne środowisko programistyczne

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

1. Wstęp. 2. Szablon. 1 WinApi Wstęp i szablon. Czym jest API?

Systemy operacyjne. Wprowadzenie. Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

PUKP Programowanie urządzeń kontrolno-pomiarowych. ztc.wel.wat.edu.pl

Projektowanie i programowanie aplikacji biznesowych. Wykład 2

Język programowania PASCAL

Programowanie w środowiskach graficznych. Wykład 1 OS, Podstawy Windows API

System komputerowy. Sprzęt. System komputerowy. Oprogramowanie

Programowanie w środowisku Windows. mgr inż. Krzysztof Mossakowski k.mossakowski@mini.pw.edu.pl

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

Robert Barański, AGH, KMIW MathScript and Formula Nodes v1.0

Programowanie w języku Python. Grażyna Koba

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Windows.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Języki i paradygmaty programowania doc. dr inż. Tadeusz Jeleniewski

Część 4 życie programu

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Umieszczanie kodu. kod skryptu

Wprowadzenie do programowania w języku C

System operacyjny System operacyjny

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Inżynieria oprogramowania

Programowanie w środowiskach graficznych. Wykład 1 OS, Podstawy Windows API

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.5

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Języki i paradygmaty programowania - 1

Podstawy Programowania Obiektowego

Zasady programowania Dokumentacja

Wybieramy File->New->Project Wybieramy aplikację MFC->MFC Application jak na rysunku poniżej:

for (inicjacja_warunkow_poczatkowych; wyrazenie_warunkowe; wyrazenie_zwiekszajace) { blok instrukcji; }

Programowanie Sieciowe 1

Akademia Techniczno-Humanistyczna w Bielsku-Białej

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Bazy danych 2. Wykład 1

Dokumentacja aplikacji Szachy online

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 3. Instrukcje wyboru

Instrukcje sterujące

Wstęp do programowania 2

Wprowadzenie do projektu QualitySpy

Programowanie w środowiskach RAD QtCreator, Qt i C++

Programowanie obiektowe

Działanie komputera i sieci komputerowej.

Tworzenie aplikacji rozproszonej w Sun RPC

Wymiar poziomy: oś na której umieszczono instancje klasyfikatorów biorące udział w interakcji.

1. Tworzenie nowego projektu.

C++ - [1-3] Debugowanie w Qt Creator

Języki programowania obiektowego Nieobiektowe elementy języka C++

Wykład I. Wprowadzenie do baz danych

Programowanie w języku C++ Grażyna Koba

Opis protokołu RPC. Grzegorz Maj nr indeksu:

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

Wykład 2: Budowanie sieci lokalnych. A. Kisiel, Budowanie sieci lokalnych

Programowanie współbieżne Wykład 2. Iwona Kochańska

Popularne dostępne rozwiązania. Najpopularniejsze środowiska programistyczne:

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Transkrypt:

Programowanie w środowiskach RAD Język C++ w środowiskach RAD Roman Simiński roman.siminski@us.edu.pl www.siminskionline.pl Programowanie sterowane zdarzeniami Geneza, koncepcja, rodzaje, przykłady

Jeszcze wcale nie tak dawno temu Komputery wykorzystywały tekstowy tryb pracy monitora a użytkownicy Programowanie w środowiskach RAD 2

Jeszcze wcale nie tak dawno temu mieli tego dość! Programowanie w środowiskach RAD 3

Podstawą programowania były sekwencja i dyktatura Program ma ściśle określony początek i koniec. Sekwencja wykonanie programu od początki do końca, pod dyktando kolejnych instrukcji napisanych przez programistę. Dyktatura program dominuje, realizuje scenariusz określony kodem, użytkownik wykonuje operacje pod dyktando programu. Nikła interakcja informacje wprowadzane przez użytkownika mają wpływ na wykonanie programu, ale zwykle jest on niewielki. To jest: Programowanie kierowane przepływem sterowania flow driven programming int main() Przetwarzanie Data data; wsadowe init(); readdata( &data ); processdata( &data ) showdata( &data ); done(); return 0; int main() Prosta char key; interakcja do showmenuitems(); switch( key = getkey() ) case '1' : doaction1(); break; case '2' : doaction2(); break; while( key!= ESC ); return 0; Programowanie w środowiskach RAD 4

Programowanie kierowane przepływem sterowania Flow driven programming Jest to tradycyjna technika programowania, w ramach której program wykonywany jest zgodnie z aktualną ścieżką przepływu sterowania, zmienianą przez instrukcje warunkowe i iteracyjne, w oparciu o dane zewnętrzne i wewnętrzne, dostarczane do programu oraz wartościowane w zdeterminowanych momentach jego wykonania. Ta technika programowania stosowana jest powszechnie w jednozadaniowych systemach, ukierunkowanych na przetwarzanie sterowanie prostymi poleceniami klawiaturowymi, zwykle w środowiskach znakowych. Aktualnie stanowi postawę realizacji systemów preferujących przetwarzanie wsadowe, wykorzystujących uproszczoną interakcję z użytkownikiem. Programowanie w środowiskach RAD 5

A co z programami wykorzystującymi tryb graficzny? Tryb graficzny wykorzystywany był tylko w wyspecjalizowanych aplikacjach: programach graficznych tworzenie i obróbka, systemach CAD/CAM (Pierre Bézier i Paula de Casteljau), grach komputerowych, programach specjalizowanych np. poligrafia. Problemy: Problemy z pracą w trybie graficznym (karty, tryby, sterowniki). Zbyt słaby sprzęt, brak wsparcia ze strony systemu operacyjnego. Brak standaryzacji w zakresie graficznego interfejsu użytkownika. Utrudniona nawigacja raczkujące urządzenia wskazujące. Programowanie w środowiskach RAD 6

W końcu jednak komputery zmężniały Powstają systemy operacyjne wykorzystujące: GUI graphical user interface czyli graficzny podsystem komunikacji z użytkownikiem zwany też: graficznym interfejsem użytkownika Programowanie w środowiskach RAD 7

Prawdziwy zamęt wprowadziły jednak gryzonie... Czy GUI wpływa na sposób programowania aplikacji? Tak aplikacje z GUI programuje się trudniej Ale prawdziwe zamieszania wprowadza pojawienie się w powszechnym użytku: Komputerowej myszy! Programowanie w środowiskach RAD 8

Od Dyktatora do Sługi upadek programisty...? Kiedyś to ja dyktowałem warunki, a teraz muszę kombinować, co on kliknie i kiedy...! Kliknę sobie tam, gdzie chcę i kiedy chcę! Ten komputer jest mój...! Świat programisty Świat użytkownika Programowanie w środowiskach RAD 9

Zmierzch programowania sterowanego przypływem FCP Rozwój GUI i manipulatorów myszopodobnych zmienił techniki programowania. Na zmiany wpłynął również rozwój architektury klient-serwer oraz protokołów wykorzystujących tę koncepcję (czyli większość protokołów internetowych). Ja tu rządzę i dyktuję warunki! FCP FDP Czekam i wykonuję polecenia FDP 1970 1980 1990 2000 2010 Programowanie w środowiskach RAD 10

Klient-serwer, sieć, przetwarzanie rozproszone Klient Żądanie usługi Żądanie Serwer Nasłuchiwanie Działanie na żądanie Odpowiedź Klient Komunikacja Serwer Programowanie w środowiskach RAD 11

Programowanie sterowane zdarzeniami driven programming EDP Nowa (relatywnie) technika programowania, zakładająca że działanie programu polega na wykonywaniu akcji będących odpowiedzią na zdarzenia dotyczące programu. Zdarzenia mogą pochodzić z otoczenia programu (użytkownik, system, sieć) lub z jego wnętrza. Zdarzenia powstają zwykle asynchronicznie w stosunku do działania programu, ten nie kontroluje momentu powstania zdarzeń oraz ich źródła (za wyjątkiem zdarzeń wewnętrznych). Programowanie w środowiskach RAD 12

Zasada Hollywood Hollywood Principle Don't call us, we'll call you http://c2.com/cgi/wiki?hollywoodprinciple Programowanie w środowiskach RAD 13

driven programming koncepcja organizacji Zdarzenie Obsługiwacz Handler Zdarzenie Zdarzenie Dyspozytor Dispatcher Obsługiwacz Handler Obsługiwacz Handler http://eventdrivenpgm.sourceforge.net/ Programowanie w środowiskach RAD 14

Koncepcja stara jak świat i powszechnie znana Przyjmowanie zleceń Kierowanie do obsługi Zlecenia klientów Obsługa zlecenia Programowanie w środowiskach RAD 15

Zdarzenia events Zdarzenie (ang. event) wynik asynchronicznej w stosunku do działania programu akcji użytkownika, urządzenia lub programu. Zdarzenie jest rejestrowane, oraz zapamiętywany jest jego kontekst. Zdarzenie w sensie programistycznym, to informacja pewnym zdarzeniu rzeczywistym, które jest istotne dla systemu informatycznego i powinno zostać w pewien sposób obsłużone. Zdarzenia generowane są zwykle przez otoczenie systemu użytkowników, inne systemy, urządzenia sprzętowe (sensory, czujniki), system operacyjny i jego składowe. Zdarzenia generowane są również przez sam system różne składowe systemu mogą generować być źródłem zdarzeń kierowanych do innych składowych tego samego systemu jak i do jego otoczenia. Programowanie w środowiskach RAD 16

Zdarzenia events! Zdarzenie jako element rzeczywistości Zdarzenie jako informacja dla systemu Programowanie w środowiskach RAD 17

Źródła zdarzeń Zdarzenie Programowanie w środowiskach RAD 18

Przykład rekordu opisu informacji o zdarzeniu Przykład opisu informacji o zdarzeniu rekord zawierający pola to typie zdarzenia, umownym kodzie w ramach danego typu, informacje o klawiaturze i myszy: struct Info int what; // Rodzaj zdarzenia int code; // Kod zdarzenia int key; // Informacja o zdarzeniu klawiaturowym int x, y; // Informacja o pozycji kursora myszy int buttons; // Informacja o stanie przycisków myszy ; W rzeczywistości rekordy opisu zdarzenia są zwykle bardziej skomplikowana i zwierają więcej informacji. Powyższy przykład ma charakter poglądowy. Programowanie w środowiskach RAD 19

Procedury obsługi zdarzeń event handlers Procedura obsługi zdarzenia (ang. event handler) wydzielony fragment oprogramowania obsługujący zdarzenie lub zdarzenia odpowiedniego rodzaju. W obrębie aplikacji to najczęściej podprogram otrzymujący informację o zaistniałym zdarzeniu, obsługujący to zdarzenie zgodnie z logiką aplikacji. Procedury obsługi są zazwyczaj dedykowane dla konkretnych typów zdarzeń. Po pomyślnej obsłudze zdarzenia informacje o nim są zerowane lub w opisie zdarzenia umieszcza się informację o jego obsłużeniu. Programowanie w środowiskach RAD 20

Procedury obsługi zdarzeń event handlers Przykładowa, hipotetyczna procedura obsługi zdarzenia pochodzącego z myszki (zakładamy, że Control to typ elementów okna dialogowego): void handlemousedown( Info event ) Control control = findcontrolonxy( event.x, event.y ); if( control == NULL ) return; switch( control.type ) case NORMAL_BUTTON : pressbutton( control ); event.what = EV_NONE; break; case RADIO_BUTTON : markradiobutton( control ); event.what = EV_NONE; break; case CHECK_BUTTON : markcheckbox( control ); event.what = EV_NONE; break; Programowanie w środowiskach RAD 21

Dyspozytor dispatcher Dyspozytor (ang. dispatcher) zadaniem dyspozytora jest pobieranie napływających zdarzeń, identyfikowanie ich i kierowanie do odpowiednich procedur obsługi (żargonowo: handlerów). Dyspozytor pracuje zazwyczaj iteracyjnie wyjście z iteracji następuje po zidentyfikowaniu zdarzenia końca. Dyspozytor powinien radzić sobie w sytuacji, gdy zdarzenie nie zostało obsłużone w żadnej z procedur obsługi. Dyspozytor może dokonywać konwersji zdarzeń dostosowując je do specyfiki działania aplikacji. Programowanie w środowiskach RAD 22

Dyspozytor dispatcher Pseudokod głównej iteracji programu pierwsza faza pracy dyspozytora, podejście proceduralne. int main() Info event; Definicja rekordu opisu zdarzenia for( ; ; ) event = getnext(); if( event.what == EV_QUIT ) break; preprocess( event ); if( event.what!= EV_NONE ) forward( event ); else idleaction(); return EXIT_SUCCESS; Uwaga to tylko przykład jednego z możliwych sposobów organizacji pracy dyspozytora. Programowanie w środowiskach RAD 23

Dyspozytor dispatcher Pseudokod głównej iteracji programu pierwsza faza pracy dyspozytora, podejście proceduralne. int main() Info event; for( ; ; ) event = getnext(); if( event.what == EV_QUIT ) break; preprocess( event ); if( event.what!= EV_NONE ) forward( event ); else idleaction(); return EXIT_SUCCESS; Pętla, czyli iteracja bez określonego warunku zakończenia (czasem instr. loop) Uwaga to tylko przykład jednego z możliwych sposobów organizacji pracy dyspozytora. Programowanie w środowiskach RAD 24

Dyspozytor dispatcher Pseudokod głównej iteracji programu pierwsza faza pracy dyspozytora, podejście proceduralne. int main() Info event; for( ; ; ) event = getnext(); if( event.what == EV_QUIT ) break; preprocess( event ); if( event.what!= EV_NONE ) forward( event ); else idleaction(); return EXIT_SUCCESS; Sprawdzenie, czy dostępne jest następne zdarzenie. Jeżeli tak, to jest pobierane, jeżeli nie to koniec działania. Uwaga to tylko przykład jednego z możliwych sposobów organizacji pracy dyspozytora. Programowanie w środowiskach RAD 25

Dyspozytor dispatcher Pseudokod głównej iteracji programu pierwsza faza pracy dyspozytora, podejście proceduralne. int main() Info event; for( ; ; ) event = getnext(); if( event.what == EV_QUIT ) break; preprocess( event ); if( event.what!= EV_NONE ) forward( event ); else idleaction(); return EXIT_SUCCESS; Czy wykryte zdarzenie nie jest czasem sygnałem zakończenia programu? Uwaga to tylko przykład jednego z możliwych sposobów organizacji pracy dyspozytora. Programowanie w środowiskach RAD 26

Dyspozytor dispatcher Pseudokod głównej iteracji programu pierwsza faza pracy dyspozytora, podejście proceduralne. int main() Info event; for( ; ; ) event = getnext(); if( event.what == EV_QUIT ) break; preprocess( event ); if( event.what!= EV_NONE ) forward( event ); else idleaction(); return EXIT_SUCCESS; Wstępne przetworzenie informacji o zdarzeniu, konwersja, zamiana, czasem sztuczki i triki Uwaga to tylko przykład jednego z możliwych sposobów organizacji pracy dyspozytora. Programowanie w środowiskach RAD 27

Dyspozytor dispatcher Pseudokod głównej iteracji programu pierwsza faza pracy dyspozytora, podejście proceduralne. int main() Info event; Czy jest rzeczywiście coś do zrobienia? for( ; ; ) event = getnext(); if( event.what == EV_QUIT ) break; preprocess( event ); if( event.what!= EV_NONE ) forward( event ); else idleaction(); return EXIT_SUCCESS; Uwaga to tylko przykład jednego z możliwych sposobów organizacji pracy dyspozytora. Programowanie w środowiskach RAD 28

Dyspozytor dispatcher Pseudokod głównej iteracji programu pierwsza faza pracy dyspozytora, podejście proceduralne. int main() Info event; for( ; ; ) event = getnext(); if( event.what == EV_QUIT ) break; preprocess( event ); if( event.what!= EV_NONE ) forward( event ); else idleaction(); return EXIT_SUCCESS; Przekazanie zdarzeń do konkretnych procedur obsługi Uwaga to tylko przykład jednego z możliwych sposobów organizacji pracy dyspozytora. Programowanie w środowiskach RAD 29

Dyspozytor dispatcher Pseudokod głównej iteracji programu pierwsza faza pracy dyspozytora, podejście proceduralne. int main() Info event; for( ; ; ) event = getnext(); if( event.what == EV_QUIT ) break; preprocess( event ); if( event.what!= EV_NONE ) forward( event ); else idleaction(); return EXIT_SUCCESS; Gdy nie wykryto oczekującego na obsługę zdarzenia obsługa procesu realizowanego w tle Uwaga to tylko przykład jednego z możliwych sposobów organizacji pracy dyspozytora. Programowanie w środowiskach RAD 30

Dyspozytor dispatcher Szczegółowa identyfikacja zdarzenia i przekazanie do procedur obsługi zgodnie z typem zdarzenia. void forward( Info event ) switch( event.what ) case EV_MOUSE_DOWN : handlemousedown( event ); break; case EV_KEY_DOWN : handlekeypress( event ); break; case EV_APP_EVENT : handleappl( event ); break; default : handleunknown( event ); break; if( event.what!= EV_NONE ) processunhandled( event ); Programowanie w środowiskach RAD 31

A gdy zdarzenia pojawiają się zbyt szybko... Handler Dispatcher Handler Kolejka (ang. queue) Handler Kolejka zdarzeń(ang. event queue) struktura danych typu FIFO, przechowująca informacje o zdarzeniach. Kolejka może być priorytetowa, istnieje możliwość reorganizowania kolejności kolejkowanych zdarzeń. Programowanie w środowiskach RAD 32

Model EDP bardziej szczegółowo... Handler Dispatcher Main Loop s Forwarding Handler Handler Programowanie w środowiskach RAD 33

Model EDP jeszcze bardziej szczegółowo, cd.... Handler Dispather s sources Main Loop s Forwarding Handler Handler Programowanie w środowiskach RAD 34

EDP, ale gdzie? Environment & Network Local machine OS Application Handler Dispather s sources Main Loop s Forwarding Handler Handler Programowanie w środowiskach RAD 35

EDP, ale gdzie? Environment & Network Local machine OS Application Handler Dispather s sources Main Loop s Forwarding Handler Handler Programowanie w środowiskach RAD 36

EDP, ale gdzie? Environment & Network Host Local machine OS OS Application Application Handler Dispather s sources Main Loop s Forwarding Handler Handler Programowanie w środowiskach RAD 37

EDP, ale gdzie? Environment & Network Host Host OS OS Request broker Services Handler Dispather s sources Main Loop s Forwarding Handler Handler Programowanie w środowiskach RAD 38

driven programming a OOP i GUI Koncepcja programowania sterowanego zdarzeniami jest niezależna od przyjętej metody programowania i stosowanego języka. Podejście obiektowe jest jednak metodą programowania idealnie pasująca do koncepcji programowania sterowanego zdarzeniami. Programowanie sterowane zdarzeniami kojarzy się głównie z systemami wykorzystującymi GUI jednak ta koncepcja programowania może być skutecznie wykorzystywana w systemach bez GUI (np. procesor i mechanizm przerwań jest event driven!). Wiele zagadnień jest podatnych na rozwiązanie event driven np. parsery, w tym parsery XML. Większość bibliotek obsługi GUI zintegrowanych abo bliskich systemowi operacyjnemu (WinAPI, XWindows, GTK) zaimplementowano w językach nieobiektowych (zwykle C), choć w sensie koncepcji są one przynajmniej obiektowo zorientowane. Programowanie w środowiskach RAD 39

driven programming a OOP i GUI, cd.... Programowanie na poziomie bibliotek GUI bliskich systemowi operacyjnemu jest żmudne. A co żmudne, jest trudne, a przynajmniej uciążliwe. Twórcy narzędzi dla programistów od lat pracują nad bibliotekami GUI umożliwiającymi łatwiejsze i efektywniejsze programowanie. Te biblioteki ze większości przypadków są obiektowe. Historycznie najwcześniejszymi bibliotekami były MFC (Microsoft) i OWL (Borland). Borland firmował również świetną! bibliotekę TurboVision dla DOS. Wraz z pojawieniem się pakietu Delphi firma Borland udostępnia bibliotekę VCL, dostępną aktualnie we wszystkich narzędziach wywodzących się z firmy Borland. W świecie społeczności OpenSource powstają biblioteki wxwidgets oraz Qt, ta ostatnia staje się podstawą programu QTDesigner oraz pakietu QTCreator, aktualnie firmowanego przez Nokię. Programowanie w środowiskach RAD 40

driven programming a WinAPI System operacyjny Identyfikowanie zdarzeń MSG Działające programy Podwójne Identyfikowanie kliknięcie MSG odbiorcy na pozycji X: 100 Y: 150 X: 100 Y: 150 MSG Usługi i programy systemowe Programowanie w środowiskach RAD 41

driven programming a WinAPI typedef struct HWND hwnd; UINT message; WPARAM wparam; LPARAM lparam; DWORD time; POINT pt; MSG, *PMSG; hwnd identyfikator okna, które otrzymuje komunikat. message identyfikator komunikatu, starszy bajt zarezerwowany dla systemu, młodszy do wykorzystania dla programów. wparam, lparam dodatkowe informacje o komunikacie, zależne od jego rodzaju. time Czas zaistnienia komunikatu. pt pozycja kursora myszy w momencie zaistnienia komunikatu. Programowanie w środowiskach RAD 42

driven programming a WinAPI typedef struct HWND hwnd; UINT message; WPARAM wparam; LPARAM lparam; DWORD time; POINT pt; MSG, *PMSG; To pole ma znaczenie podstawowe i określa charakter komunikatu Identyfikator komunikatu message zawiera najczęściej nazwaną stałą określającą zaistniałe zdarzenie. Procedura obsługi zdarzenia sprawdza pole message i podejmuje stosowną obsługę, być może posiłkując się dodatkowymi polami rekordu MSG. Przykład identyfikator WM_PAINT oznacza, że zaistniało zdarzenie powodujące konieczność przerysowania zawartości obszaru klienckiego okna, co powinna zrealizować procedura obsługi komunikatów. Programowanie w środowiskach RAD 43

driven programming a WinAPI System operacyjny Identyfikowanie zdarzeń Komunikaty opisujące zdarzenia są kolejkowane. System obsługuje pojedynczą systemową kolejkę komunikatów oraz kolejki przydzielane indywidualnie dla każdego programu (wątku) wykorzystującego GUI. Program A Działające programy Identyfikowanie odbiorcy MSG Program B MSG Usługi i programy systemowe Komunikaty wstawiane są do systemowej kolejki, skąd są pobierane przez system. Po określeniu odbiorcy, komunikat wstawiany jest do indywidualnej kolejki programu (wątku). Programowanie w środowiskach RAD 44

Dyspozytor w WinAPI int WINAPI WinMain( HINSTANCE hinst, HINSTANCE hprev, LPSTR lpszcmdline, int ncmdshow ) WNDCLASSEX winclass; Pobranie komunikatu z kolejki HWND hwndmain; MSG msg; Przekształcenie komunikatów... związanych z klawiaturą. ShowWindow( hwndmain, ncmdshow); UpdateWindow( hwndmain ); while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) TranslateMessage( &msg ); DispatchMessage( &msg ); return msg.wparam; Odnalezienie i uruchomienie przez system operacyjny procedury obsługi komunikatu Programowanie w środowiskach RAD 45

Schemat obiegu komunikatów na poziomie WinAPI 11 Pobranie komunikatu z kolejki programu System operacyjny 22 Wstawienie informacji do rekordu komunikatu 22 33 44 Translacja komunikatów 55 Pobranie komunikatu do obsługi 66 Przekazanie komunikatu do procedury obsługi Usługi i programy systemowe GetMessage TranslateMessage 11 33 44 msg 55 Program Inne podprogramy Zarejestrowana klasa okna programu lpfnwndproc DispatchMessage 66 Procedura obsługi komunikatów Wskaźnik na procedurę obsługi komunikatów tzw. procedura okna Programowanie w środowiskach RAD 46

Procedura okna procedura obsługi komunikatów LRESULT CALLBACK WndProc( HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam ) switch( umsg ) case WM_CLOSE: DestroyWindow( hwnd ); break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hwnd, umsg, wparam, lparam ); return 0; Program się kończy, wstaw komunikat WM_QUIT, który zakończy działanie iteracji sterowanej funkcją GetMessage Komunikat oznaczający zdarzenie zamknięcia okna. Usuń okno główne i potomne, wstaw komunikat WM_DESTROY Programowanie w środowiskach RAD 47

driven programing... ale w czym? Programowanie na poziomie bibliotek bliskich systemowi operacyjnemu jest żmudne to już było. Jest idealne dla pisania sprytnych programów blisko zintegrowanych z systemem operacyjnym, lub oprogramowania o wysokich wymaganiach wydajnościowych. Uważam że programowanie na tym poziomie ogranicza programistę tak samo, jak kiedyś ograniczało programowanie złożonych aplikacji w językach symbolicznych. Tematem dalszych wykładów będzie prezentacja koncepcji, technik i wybranych przykładów programowania z wykorzystaniem pakietów C++ Builder i biblioteki VCL oraz QtCreator i biblioteki Qt. Programowanie w środowiskach RAD 48

Dziękuję za uwagę Pytania? Polemiki? Teraz, albo: roman.siminski@us.edu.pl