Opis zadania i szczegółowe wymagania
Należy zaimplementować dwa tryby synchronizacji danych z VariableTable wewnątrz MemoryMap, aby frontend mógł prawidłowo wyświetlać stany symulacji. W tym zadaniu musi zawierać się:
- Implementacja funkcji "Pełny Snapshot": metoda pozwalająca na pobranie i przepisanie wszystkich aktualnych stanów z
MemoryMap do VariableTable (konieczna do wywołania m.in. przy starcie symulacji).
- Implementacja "Delta Tracking": wykorzystanie klasy
DeltaTracker do śledzenia i gromadzenia tylko tych zmian, które zaszły w ostatnim wywołaniu cycle().
- Zabezpieczenie dostępu do danych (Thread Safety): ponieważ silnik symulacji w C++ może działać w innym wątku niż komunikacja sieciowa oparta na Saucer, operacje odczytu i zapisu w
MemoryMap muszą być odpowiednio chronione (np. za pomocą std::mutex).
Dodatkowy kontekst i źrodła pomocnicze
Zarządzanie wątkami w tym miejscu jest krytyczne dla stabilności całego symulatora. Kiedy główna pętla PLC z dużą prędkością aktualizuje stany pamięci, asynchroniczny wątek komunikacyjny może próbować wyciągnąć z niej dane (Delta lub Snapshot) w celu wysłania na frontend. Brak synchronizacji doprowadzi do data race i awarii programu. Dobrą praktyką jest zastosowanie std::lock_guard dla prostych sekcji krytycznych lub std::shared_mutex (jeśli odczytów jest znacznie więcej niż modyfikacji). Należy pamiętać, że tracker po przekazaniu paczki "Delta" musi zostać zresetowany na potrzeby kolejnego cyklu.
Definicja wykonania zadania
Opis zadania i szczegółowe wymagania
Należy zaimplementować dwa tryby synchronizacji danych z
VariableTablewewnątrzMemoryMap, aby frontend mógł prawidłowo wyświetlać stany symulacji. W tym zadaniu musi zawierać się:MemoryMapdoVariableTable(konieczna do wywołania m.in. przy starcie symulacji).DeltaTrackerdo śledzenia i gromadzenia tylko tych zmian, które zaszły w ostatnim wywołaniucycle().MemoryMapmuszą być odpowiednio chronione (np. za pomocąstd::mutex).Dodatkowy kontekst i źrodła pomocnicze
Zarządzanie wątkami w tym miejscu jest krytyczne dla stabilności całego symulatora. Kiedy główna pętla PLC z dużą prędkością aktualizuje stany pamięci, asynchroniczny wątek komunikacyjny może próbować wyciągnąć z niej dane (Delta lub Snapshot) w celu wysłania na frontend. Brak synchronizacji doprowadzi do data race i awarii programu. Dobrą praktyką jest zastosowanie
std::lock_guarddla prostych sekcji krytycznych lubstd::shared_mutex(jeśli odczytów jest znacznie więcej niż modyfikacji). Należy pamiętać, że tracker po przekazaniu paczki "Delta" musi zostać zresetowany na potrzeby kolejnego cyklu.Definicja wykonania zadania