Witam,
Jestem w trakcie tworzenia aplikacji zajmującej się komunikacją z dwoma urządzeniami, które kontrolują pewien układ. W tej komunikacji bardzo istotnym parametrem jest wysyłanie i odbieranie komunikatów do/z urządzeń w odpowiednim i możliwie dokładnym czasowo momencie (precyzja ok 10 ms).
Generalnie aplikacja posiadałaby następujące wątki:
- wątek (T) z timerem pracujący na najwyższym priorytecie oparty np. na 'QueryPerformaceCounter' generujący sygnały do wątku głównego (GUI) z częstością np. co 2 ms
- wątek (K) odpowiadający za komunikację z urządzeniami - odczyt i zapis parametrów
- wątek (G) lub wątki odpowiadające za generowanie grafiki (głównie wykresy itp.) z danych odebranych od urządzeń
- wątek główny (GUI) łączący pozostałe w jedną całość Tak więc wątki poboczne komunikowałyby się jedynie z wątkiem głównym, który to łaczyłby ich pracę w jedną całość.
Praca aplikacji a dokładniej komunikacja wątku głównego z wątkami miałaby wyglądać w pewnego rodzaju pętli, a mianowicie:
- zliczanie sygnałów z wątku timera (T)
- sprawdzanie czy wątek (K) posiada nowe dane z urządzeń, które należy odebrać. Jeśli tak następuje odbiór tych danych i dołączenie do już zebranych.
- np. co 10 sygnał timera: sprawdzamy najpierw czy wątek (K) jest gotowy do odbioru nowego polecenia, jeśli tak to wysyłamy polecenie i wątek je wykonuje, jeśli nie (wątek realizuje jeszcze poprzednie polecenie) to zapamiętujemy nowe polecenie tak by przy najbliższej możliwej okazji móc je wysłać oczywiście po odbiorze wcześniej danych z wyniku poprzedniego polecenia.
- sprawdzamy czy wątek (G) wygenerował grafikę. Jeśli tak to aktualizujemy (GUI) nową grafiką.
- jeśli wątek (G) nie generuje grafiki wysyłamy polecenie wygenerowania nowej na podstawie zebranych dotychczas danych
Mając ogólną ideę mam kilka pytań:
- Jak najlepiej zrealizować tą pętlę wątku głównego tak by nie zajmowała w całości procesora i w międzyczasie realizować obsługę innych zdarzeń związanych z obsługą GUI - przemieszczanie okna, zmiana rozmiaru i inne czynności
- W jaki sposób najwygodniej dokładnie zliczać sygnały timera (czy za pomocą Messages, czy może Eventów lub innych metod)
- Jak najlepiej skomunikować ze sobą wątek (K) oraz wątek (G) z wątkiem głównym by działały wg powyższego opisu. W szczególności jak to można zrobić w przypadku wątku (G) gdzie grafika byłaby generowana z dużej ilości danych rzędu czasem nawet kilkudziesięciu Mb, chodzi o to jak sprawnie przekazać te dane do tego wątku.
Dużo czytałem i szukałem informacji na temat wielowątkowości (Mutexy, Semafory, Sekcje Krytyczne itp.). Wydaje mi się, że za pomocą Eventów (SetEvent oraz WaitForSingleObject) można byłoby to w miarę łatwo zrealizować jednak chciałbym się poradzić Was - bardziej doświadczonych programistów, jak najszybciej i najprościej zrealizować powyższe założenia pracy programu.
Pozdrawiam