Lekcja 5. Funkcje handlemessage() i initialize(), konstruktor i destruktor

Podobne dokumenty
Lekcja 4. Wektory bram i wektory modułów

Lekcja 3. Statystyki narzędzie Result Analysis

Lekcja 1. Środowisko OMNeT++

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

KS-ZSA. Mechanizm centralnego zarządzania rolami

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Sieci Komputerowe 2 / Ćwiczenia 2

Wykład 4: Klasy i Metody

Klient poczty elektronicznej - Thunderbird

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

PARADYGMATY PROGRAMOWANIA Wykład 4

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Dokumentacja wstępna TIN. Rozproszone repozytorium oparte o WebDAV

Programowanie Obiektowe Ćwiczenie 4

podstawowa obsługa panelu administracyjnego

Konfiguracja konta pocztowego w Thunderbird

Aplikacja Sieciowa wątki po stronie klienta

Wykład 5: Klasy cz. 3

Zaawansowane programowanie w języku C++ Klasy w C++

Programowanie obiektowe

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Metody Metody, parametry, zwracanie wartości

Współpraca z platformą dokumentacja techniczna

Wprowadzenie. wersja SYSTIM

PARADYGMATY PROGRAMOWANIA Wykład 3

1. Proszę wejść na stronę: poczta.home.pl i zalogować się do nowej skrzynki za pomocą otrzymanych danych.

2014 Electronics For Imaging. Informacje zawarte w niniejszej publikacji podlegają postanowieniom opisanym w dokumencie Uwagi prawne dotyczącym tego

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

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

Przychodnia 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę Osoba.

podstawowa obsługa panelu administracyjnego

Instrukcja aktualizacji programu Integra 7

Lekcja 2. Tworzenie i uruchamianie prostej symulacji

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

Materiały do zajęć VII

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

TEMAT : KLASY DZIEDZICZENIE

Programowanie obiektowe w języku C++ Zarządzanie procesami. dr inż. Jarosław Forenc. Przeładowanie (przeciążanie) operatorów

Wykład 8: klasy cz. 4

Instrukcja Użytkownika

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x

Programowanie obiektowe

Programowanie 2. Język C++. Wykład 3.

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

epuap Archiwizacja w Osobistym Składzie Dokumentów

Java Developers Day. Implementacja ESB przy użyciu Mule. ESB Mule Obsługa zamówień DEMO

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

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Konstruktor kopiujacy

IIIIIIIIIIIIIIIMMIMMIII

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Architektury systemów rozproszonych LABORATORIUM. Ćwiczenie 1

MODUŁ INTEGRUJĄCY ELEKTRONICZNEGO NADAWCĘ Z WF-MAG SPIS TREŚCI

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

INSTRUKCJA KONFIGURACJI KLIENTA POCZTOWEGO

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Szablony funkcji i klas (templates)

Efekty uboczne błędów

Satel Integra FIBARO

Wprowadzenie do projektu QualitySpy

Kurs WWW. Paweł Rajba.

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Fiery Remote Scan. Uruchamianie programu Fiery Remote Scan. Skrzynki pocztowe

Zamawianie Taxi Aktywator Instrukcja użytkownika

Współpraca z platformą Emp@tia. dokumentacja techniczna

Wątki w Android OS. Matt Rutkowski. GynSoft sp. z o.o. matt@gynsoft.net

Zawartość. Wstęp. Moduł Rozbiórki. Wstęp Instalacja Konfiguracja Uruchomienie i praca z raportem... 6

Aplikacje w środowisku Java

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

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Działanie komputera i sieci komputerowej.

Baza danych sql. 1. Wprowadzenie

Rozwiązanie przygotowane z myślą o użytkownikach programu Symfonia Handel, którzy zajmują się sprzedażą węgla, różnego sortu

Język C++ zajęcia nr 2

Rysunek 1: Okno z lista

Plik klasy. h deklaracje klas

Programowanie w języku C++

Programowanie zespołowe

Szablony klas, zastosowanie szablonów w programach

Rozdział 4 KLASY, OBIEKTY, METODY

dr inż. Jarosław Forenc

Spis treści. 1 Moduł RFID (APA) 3

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Abstrakcyjny typ danych

Instrukcja użytkownika. Aplikacja dla WF-Mag

Program dla praktyki lekarskiej

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

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

Zadanie1. Wykorzystując serwis internetowy Wikipedii wyjaśnij następujące pojęcia: wirtualizacja, VirtualBox, Vmware, KVM, Virtual PC, Hyper-V.

Konfiguracja podglądu obrazu z kamery IP / rejestratora BCS przez sieć LAN.

Transkrypt:

Lekcja 5. Funkcje handlemessage() i initialize(), konstruktor i destruktor W lekcji 5 objaśniane jest działanie i zastosowanie funkcji handlemessage() oraz initialize(). Omówiony zostanie również konstruktor i destruktor oraz przedstawiony zostanie sposób tworzenia symulacji dającej możliwość wyboru sposobu uruchamiania. W lekcji 2 wspomniane było na temat stosowania funkcji activity() lub handlemessage() do wpływania na przetwarzania zdarzeń zachodzących podczas symulacji. Dla każdego modułu prostego należy zdefiniować jedną z tych funkcji. W celu zaprezentowania sposobu działania funkcji handlemessage() zostanie ona zastosowana w sieci komputerowej z zadania z Lekcji 4. Model symulacyjny zostanie uzupełniony o możliwości wyboru liczby klientów generujących zadania do serwera. We wcześniejszych lekcjach stosowana była funkcja activity(). Ponieważ w tej lekcji zaplanowane jest opracowanie symulacji, pozwalającej na wybór większej liczby klientów, a funkcja activity() wymaga definiowania stosów dla każdego modułu, powodowałoby to duże zużycie pamięci. Funkcja handlemessage() nie korzysta ze stosu więc będzie odpowiednią do tego typu symulacji. W funkcji activity() można było wpływać na to, kiedy i jak zostanie obsłużona wiadomość natomiast funkcja handlemessage() wywoływana jest dla każdej wiadomości przychodzącej do modułu. Poza tym podczas wywołania funkcji handlemessage() nie upływa czas symulacyjny dlatego nie można stosować razem z tą funkcja metod wait() ani receive(). Wraz z funkcja handlemessage() można używać metody obsługujące zdarzenia takie jak: send() wysyła wiadomości do innych modułów; scheduleat() wysyła wiadomości do siebie; cancelevent() usuwa zdarzenia zaplanowane przy pomocy funkcji scheduleat(); Ponieważ w zadaniu w module np. Dysk_twardy konieczne jest wykorzystanie funkcji wait() w celu opóźnień związanych z obsługą wyszukiwania na dysku, a moduły działające na funkcjach 53

handlemessage() i activity() mogą być dowolnie mieszane w modelu symulacyjnym, więc w zadaniu zostaną zastosowane obie funkcje. Zmiany w zadaniu z lekcji 4 zaczniemy od uzupełnienia pliku omnetpp.ini o sekcję [Config nazwa] dla poszczególnych uruchomień symulacji. [Config cztery] będzie uruchamiał symulacje z 4 klientami, a [Config pytaj] będzie pozbawiony wartości ilosc_klientow, która odpowiada za liczbę klientów w sieci, co będzie powodowało zapytanie o tą wartość przy starcie programu. W sekcjach tych można umieszczać parametry, których wartość przysłaniają parametry globalne. W wersji 4.0 omneta możemy skorzystać z formularza edycji pliku omnetpp.ini Wybieramy Sections, a następnie New i wpisujemy nazwę sekcji i opis (dowolnie). Rys. 1. : Okno dodawania sekcji Źródło: wykonanie własne Wybierając source możemy podejrzeć, że omnet samodzielnie wpisał kod do pliku omnetpp.ini. [Config cztery] description = "cztery klienty" [Config pytaj] description = "pyta o liczbe klientow" Następnie przechodzimy do Parameters, gdzie możemy przypisać wartości parametrom dla danej konfiguracji. Oprócz liczby klientów podane zostały również inne parametry. 54

Rys. 2. : Okno dodawania parametrów Źródło: wykonanie własne Źródło pliku wygląda teraz następująco: [General] network = Lekcja5 [Config cztery_k] description = "cztery klienty" Lekcja5.ilosc_klientow = 4 # czterech klientow **.czas_namyslu = 5 **.wielkosc_danych = 50 [Config pytaj] description = "pyta o liczbe klientow" Prezentowany plik umożliwia uruchamianie konfiguracji zgodnie z potrzebami. Rys. 3 przedstawia okno pozwalające wybrać, którą konfigurację chcemy użyć. 55

Rys. 3. : Okno uruchamiania konfiguracji Źródło: wykonanie własne Ponieważ moduł Klient ma za zadanie jedynie wysyłanie komunikatów do switcha nie ma potrzeby używania w nim funkcji activity() i definiować dla niego stos. Zastosowana zostanie więc funkcja handlemessage() oraz funkcja initialize(), w której zostanie zaplanowane wysyłanie wiadomości. Zastosowany zostanie również konstruktor i destruktor. 56

class Klient : public csimplemodule private: cmessage *sendmessage; public: Klient(); virtual ~Klient(); protected: virtual void initialize(); virtual void handlemessage(cmessage *msg); ; Funkcja handlemessage() wywoływana jest jedynie w przypadku otrzymania wiadomości. Moduł Klient ma za zadanie generować wiadomości wiec konieczne jest zainicjowanie wysyłania wiadomości do samej siebie, czyli scheduleat(), która będzie odpowiedzialna za ciągle planowanie wysłań. Konstruktor jest wywoływany, kiedy tworzony jest moduł. Ustawia on wartość parametru na NULL. Następnie tuż przed rozpoczęciem wykonania symulacji wywołana jest funkcja initialize(). Destruktor zastosowany jest w celu usunięcia wszystkiego, co zostało zaalokowane funkcją new i co znajduje się w module klasy. Do usunięcia własnych wiadomości używa się funkcji cancelanddelete(msg). Klient::Klient() sendmessage = NULL; Klient::~Klient() cancelanddelete(sendmessage); Wewnątrz funkcji initialize() zaplanowane jest pierwsze wysłanie wiadomości powodujące pierwsze wywołanie funkcji handlemessage(). void Klient::initialize() sendmessage = new MyPacket ("sendmessage"); scheduleat(0.0, sendmessage); Następnie konieczne jest zaplanowanie przyszłych zdarzeń dla modułu w funkcji handlemessage(). Używa się w tym celu funkcji 57

scheduleat(simtime()+delta), która jako parametr akceptuje całkowity czas symulacji. Implementując funkcje handlemessage() należy pamiętać o sprawdzeniu czy przychodząca wiadomość jest własną wiadomością czy przysłaną przez inny moduł. W przypadku modułu Klient komunikaty przybyłe od modułu Switch nie są obsługiwane tylko usuwane. Jeśli komunikat jest wiadomością zaplanowaną przez moduł Klient to sprawdzany jest identyfikator bramy połączonej z bramą wyjściową Klienta, i ta wartość ustawiana jest jako kind, a następnie wysłana w wiadomości do switcha. void Klient::handleMessage(cMessage *msg) char nazwa[20]; int wielkosc_danych = par ("wielkosc_danych"); strcpy(nazwa,"od_klienta"); MyPacket *zadanie = new MyPacket (nazwa); int id_klienta = gate("od_klienta")->getownermodule()-> getindex()+1; //spr czy wiadomość jest wiadomością wyslana do siebie if (msg==sendmessage) zadanie->setkind(id_klienta); zadanie->setsrcaddress(id_klienta); zadanie->setdestaddress(1); zadanie->setbytelength(wielkosc_danych); ev << "Klient do switcha zadanie z kind=" << zadanie->getkind() << ",Wielkosc danych= " << wielkosc_danych << endl; send(zadanie, "od_klienta"); scheduleat(simtime()+(double)par("czas_namyslu"), sendmessage); else delete msg; Możliwe jest również zastosowanie funkcji handlemessage() w module Sterowanie_switchem, którego zadanie polega jedynie na zmianie adresu docelowego i odesłanie wiadomości z powrotem do Magazynu. class sterowanie_switchem: public csimplemodule public: 58

MyPacket *zadanie; protected: virtual void initialize(); virtual void handlemessage(cmessage *msg); ; Ponieważ moduł ma reagować tylko na wiadomości pochodzące od Magazynu, planowanie zdarzeń nie jest potrzebne. void Sterowanie_switchem::handleMessage( cmessage *zadanie) zadanie = (MyPacket *) msg; ev << "Sterowanie dostalo od Magazynu zadanie z kind="<<zadanie->getkind()<< endl; int dest = zadanie->getdestaddress(); zadanie->setdestaddress(dest+1); send (zadanie, "do_portow"); ev << "Sterowanie do Magazyn zadanie z kind=" << zadanie-> getkind() << endl; Sposób wykorzystania funkcji handlemessage() zostanie również pokazany w module Procesor. Działanie funkcji handlemessage() w tym module jest odmienne ze względu na potrzebę poprawnej obsługi kolejki. class Procesor: public csimplemodule protected: virtual void handlemessage(cmessage *msg); public: MyPacket *zadanie; cqueue kolejka; virtual void wysylamy_na_dysk(cmessage MyPacket *); virtual void wysyla_do_switcha_od_serwera(cmessage MyPacket *); ; Podobnie jak w przypadku modułu Sterowanie_switchem, moduł Procesor reaguje jedynie na komunikaty przybyłe od innych modułów więc nie ma potrzeby definiowania funkcji initialize(), ani planowania zdarzeń za pomocą scheduleat(). Na początek należy sprawdzić czy wiadomość jest wiadomością własną (isselfmessage) lub też przybyła od dysku albo od switcha. Następnie sprawdzane jest czy kolejka jest pusta, jeśli tak to wykonywane jest działanie na przybyłej wiadomości. Natomiast w przypadku istnienia zadań w kolejce, przybyłe zadanie wrzucane jest na koniec kolejki za pomocą 59

nazwa_kolejki.insert(msg), a obsłużone jest zadanie pobrane z kolejki za pomocą metody pop(). void Procesor::handleMessage(cMessage *msg) kolejka.setname("kolejka"); if (msg->isselfmessage()) char nazwa[20]; strcpy(nazwa, msg->getname()); zadanie = (MyPacket *) msg; if(strcmp(nazwa,"do_dysku")==0) ev << "Procesor do dysku zadanie z kind=" << msg- >getkind() << endl; send (zadanie, "do_dysku"); else if(strcmp(nazwa,"do_switcha")==0) ev << "Procesor do switcha zadanie z kind=" << msg->getkind() << endl; send(zadanie,"do_klienta"); //sprawdzenie czy jest cos w kolejce if (!kolejka.empty()) zadanie = (MyPacket *)kolejka.pop(); int dest = zadanie->getdestaddress(); zadanie->setdestaddress(dest+1); //spr czy od switcha if (dest == 4) ev << "Procesor dostal od switcha zadanie z kind=" << zadanie->getkind() << endl; wysylamy_na_dysk(zadanie); //spr czy z dysku else ev << "Procesor dostal od dysku zadanie z kind=" << zadanie->getkind() << endl; wysyla_do_switcha_od_serwera(zadanie); 60

else int dest; // jesli kolejka jest pusta to odbiera zadanie za pomoca funkcji receive if (kolejka.empty()) zadanie=(mypacket *) msg; konca kolejki else // w przeciwnym wypadku pobiera zadanie z zadanie = (MyPacket *)kolejka.pop(); kolejka.insert(msg); dest = zadanie->getdestaddress(); zadanie->setdestaddress(dest+1); //spr czy przyszlo od switcha if (dest == 4) ev << "Procesor dostal od switcha zadanie z kind=" << zadanie->getkind() << endl; wysylamy_na_dysk(zadanie); //spr czy wrocilo z dysku else ev << "Procesor dostal od dysku zadanie z kind=" << zadanie->getkind() << endl; wysyla_do_switcha_od_serwera(zadanie); Jeśli w ramach jednego moduły wysyłanych jest kilka wiadomości własnych, to warto nadać im odpowiednie nazwy, aby w łatwy sposób rozpoznać czego dotyczą, np. w metodzie wysyłającej na dysk można to rozwiązać następująco: void Procesor::wysylamy_na_dysk(MyPacket *zadanie) char nazwa[20]; strcpy(nazwa, "do_dysku"); double czas_wyszukiwania_danych = (double)par("czas_wyszukiwania_danych"); sendmessage = zadanie; sendmessage->setname(nazwa); 61

scheduleat(simtime()+czas_wyszukiwania_danych, sendmessage); Zadanie do samodzielnego przygotowania: W programie opracowanym samodzielnie w ramach zadania 4 zmienić wszystkie moduły, poprzez zamianę funkcji activity na handlemessage, tak, by nie zmienić funkcjonalności programu. 62