timeTrigger(2).docx

(66 KB) Pobierz

 

W TimeTrigger aktywności zostają zawieszone na Triggerze do czasu zwolnienia metodą Triggera lub po upływie czasu zadanego w konstruktorze Triggera. W efekcie pierwsza aktywność zawieszająca się na Trigerze uruchamia odliczanie czasu, który jeśli upłynie spowoduje zwolnienie wszystkich zawieszonych w międzyczasie aktywności (pod warunkiem, że wcześniej nie zwolniono ich jawnie metodą Triggera).

Opis realizowanego rozwiązania

Do poprawnego zrealizowania zdefiniowanego zadania wykorzystana została klasa Trigger znajdująca się już w bibliotece DESKit, w pakiecie deskit.synchronizers. Klasa ta została odziedziczona, dzięki czemu funkcjonalność podstawowego wyzwalacza została pozyskana automatycznie.

Idea automatycznego odliczania czasu do uruchomienia wyzwalacza została zrealizowania w oparciu o aktywność, która uruchamiana w tle odlicza czas podawany dla wytwarzanego triggera jako parametr. Na realizację takich działań pozwala funkcja waitDuration, oferowana w ramach klasy SimActivity. W wyniku taki założeń powstała dodatkowa klasa pomocnicza Timer, dziedzicząca po SimActivity.

Całość zmian w stosunku do klasy Trigger sprowadza się do następujących zabiegów:

-        W metodzie dodającej aktywność do listy oczekiwanych na danym wyzwalaczu - wait() - dodano warunek sprawdzający, czy umieszczana aktywność jest pierwszą aktywnością w liście. Jeśli tak jest, uruchamiana jest aktywność zgodna z klasą Timer, która zajmuje się odliczaniem czasu i uruchomieniem wyzwalania po czasie zadanym przy tworzeniu wyzwalacza czasowego.

-        W metodach uruchamiających wyzwalacz, po zwolnieniu zatrzymanych aktywności, przerywana jest aktywność odpowiedzialna za odliczanie czasu. W ten sposób umożliwiamy realizację rozwiązania zgodnie z wytycznymi zadania.

-        Dodatkowo powstały metody umożliwiające zwrócenie wprowadzonego interwału czasowego oraz ustawienie nowego czasu odliczania w przypadku gdy timer nie został jeszcze uruchomiony. Są to odpowiednio getTime() i setTime().

Przedstawione tu zabiegi w postaci kodu źródłowego, wraz z odpowiednim komentarzem, zawarte są w załączonym do opracowania archiwum z obszarem roboczym, na którym dane rozwiązanie zostało wytworzone.

Wykaz atrybutów

TimeTrigger

private Timer timer

Opis: obiekt klasy Timer do odliczania czasu. Jest to utworzona w konstruktorze TimeTriggera aktywność z określoną dodatkowo wartością czasu symulacyjnego (typu double) zawieszenia aktywności.

 

private simObject smObj

Opis: zwykły obiekt symulacyjny z biblioteki DESKit dla obsługi timera tworzony w konstruktorze timeTriggera.

Private Boolean timerChange = true

Opis: flaga sprawdzająca, czy timer został już uruchomiony. Domyślnie jest ustawiona na wartość: prawda. Zostaje zmieniona na wartość fałsz w metodzie wait() po uruchomieniu timera.

 

Timer

private double time

Opis: czas oczekiwania przez trigger wyrażony w czasie symulacyjnym, wartość typu double.

 

private TimeTrigger timeTrg

Opis: obiekt klasy TimeTrigger dla którego tworzony jest timer.

 

Wykaz metod

TimeTrigger

public Boolean setTime(double newTime)

Wejście: double newTime – nowa wartość czasu zawieszenia aktywności na Triggerze.

Wyjście:  Metoda zwraca aktualny stan flagi TimerChange w postaci wartości boole’owskiej (true/false)

Opis: metoda ustawia nowy czas zawieszenia aktywności na Triggerze. Czas ten podajemy jako argument metody, ale w przypadku, gdy Timer został już uruchomiony zmiana czasu nie jest możliwa (pole TimerChange klasy TimeTrigger ma wartość false).

 

public double getTime()

Wejście: metoda nie przyjmuje na wejście żadnych argumentów.

Wyjście: metoda zwraca wartość typu double czasu zawieszenia na Triggerze.

Opis: metoda zwraca aktualny czas zawieszenia aktywności na Triggerze poprzez wywołanie metody getTime() Timera utworzonego w konstruktorze naszego TimeTriggera.

 

public void wait(SimActivity m)

Wejście: metoda przyjmuje na wejście obiekt klasy SimActivity.

Wyjście: metoda nie zwraca żadnej wartości.

Opis: metoda ta przeciąża metodę wait(simActivity m) dziedziczonej przez nasz TimeTrigger klasy Trigger. W instrukcji warunkowej if sprawdzamy, czy są zawieszone aktywności na liście waitingList(). W przypadku gdy lista jest pusta (waitingList.length() <= 0) zostaje uruchomiony Timer oraz flaga timerChange zostaje ustawiona na wartość false. Następnie zostaje uruchomiona metoda wait(m) nadklasy.

public void fire()

Wejście: metoda nie przyjmuje żadnych argumentów wejściowych.

Wyjście: metoda nie zwraca żadnej wartości.

Opis: metoda ta przeciąża metodę fire() dziedziczonej klasy Trigger() oraz dodatkowo następuje sprawdzenie, czy lista oczekujących aktywności jest pusta. W przypadku potwierdzenia Timer jest zatrzymany i przerwany oraz w konstruktorze zostaje utworzony nowy Timer o takiej samej wartości czasu jak poprzednio.

public void fireAll()

Wejście: metoda nie przyjmuje żadnych argumentów wejściowych.

Wyjście: metoda nie zwraca żadnej wartości.

Opis: metoda ta przeciąża metodę fireAll() dziedziczonej klasy Trigger() oraz dodatkowo sprawdza, czy lista zawieszonych aktywności jest pusta. Jeśli tak jest to działanie Timera jest przerwane a w konstruktorze jest tworzony nowy Timer o takiej samej wartości czasu jak poprzednio.

 

Timer

public void setTime(double newTime)

Wejście: metoda przyjmuje na wejściu wartość czasu symulacyjnego na jaki będą zawieszane aktywności na triggerze. Wartość jest typu double.

Wyjście: metoda nie zwraca żadnej wartości.

Opis: metoda ustawia wartość typu double (przekazywaną jako argument w metodzie) dla pola time obiektu timera. Pole to będzie przechowywać czas zawieszenia aktywności na triggerze.

 

 

Public double getTime()

Wejście: metoda nie przyjmuje żadnych argumentów wejściowych.

Wyjście: metoda zwraca wartość (typu double)  pola time obiektu naszego timera.

Opis: metoda zwraca wartość (typu double)  pola time obiektu naszego timera. Jest wywoływana później wewnątrz metod getTime(), fire() oraz fireAll() obiektów klasy TimeTrigger().

 

public void action()

Wejście: metoda nie przyjmuje żadnych argumentów wejściowych.

Wyjście: metoda nie zwraca żadnej wartości na wyjściu.

Opis: jest to przeciążona metoda dziedziczonej klasy SimActivity(). Po uruchomieniu metody następuje oczekiwanie przez czas podany w konstruktorze w wywołaniu waitDuration(time) a następnie zostaje sprawdzone w instrukcji if, czy nie przerwano w żaden sposób odliczania czasu. Jeśli tak się nie stało, to zostają zwolnione aktywności (za pomocą wywołania timeTrg.fire() ) zawieszone na TimeTriggerze dla którego został utworzony timer.

Diagram klas

Diagram klas.jpg

4

 

Zgłoś jeśli naruszono regulamin