Bariery oraz GUI

by Paweł Paduch published 2021/01/21 00:58:00 GMT+2, last modified 2021-01-29T17:38:16+02:00
  1. Barriers (2.5)
    W przykładowym projekcie Barriers został zrealizowany prosty algorytm genetyczny. 
    • Inicjalizacja pierwszego pokolenia losowymi wartościami
    • Ewaluacja - czyli wyliczenie wartości na podstawie parametru
    • Losowanie - na podstawie rankingu. Ostatni ma jedną szansę przedostatni dwie itd. 
    • Bitowe krzyżowanie 
    • Mutacja
    Przerobić program tak, by ewaluacja realizowana była na osobnym wątku dla każdego elementu tablicy.
    Wątki powinny być tworzone tylko raz przed rozpoczęciem obliczeń. Każda iteracja algorytmu ma być synchronizowana za pomocą bariery (System.Threading.Barrier, SignalAndWait). Rozważyć czy jedna bariera wystarczy? 

  2. Monitory (1)
    Do solucji dodać nowy projekt Monitory. Do niego dodajmy referencję do poprzedniego projektu, tak by wykorzystać klasę GAHelper. Kod zawarty w Program.cs można częściowo przekopiować.
    Zamiast mechanizmu bariery zastosować Monitor symulujący Barierę. Monitor posiada dwie metody, które nam będą pomocne, Wait i PulseAll. Należy też dodać licznik zliczający czy bariera została już osiągnięta czy nie.

  3. Wątki w WPF (1.5)
    W przykładowej solucji w projekcie WPFThreads zrealizowano prosty problem producenta i konsumenta oparty na BlockingCollection. Program po uruchomieniu w w oknie diagnostycznym "Output" wyświetla za pomocą Trace.WriteLine infomacje od producenta i konsumentów. 

    image.png

    Okienko aplikacji na razie nic nie pokazuje. 
    image.png

    Należy tak zmodyfikować aplikację aby producent wypisywał informacje o dodaniu elementu w lewym TextRichBox a konsumenci o pobraniu elementu w prawym. Dodatkowo na środku powinniśmy widzieć stan kolekcji, ile elementów jest w niej aktualnie. 
    Np. tak:

    image.png

    Pamiętajmy, że wątek nie będący twórcą danego elementu GUI nie może go zmieniać wprost. Należy zastosować mechanizmy poznane na wykładzie (np. Dispatcher.Invoke).