Komunikacja wątków z wątkiem GUI

0

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ń:
  1. 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   
  2. W jaki sposób najwygodniej dokładnie zliczać sygnały timera (czy za pomocą Messages, czy może Eventów lub innych metod)   
  3. 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

0

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
Zbieranie danych realizować na mikroprocesorze z systemem czasu rzeczywistego, i możliwie dużym buforem. Potem sobie na spokojnie ściągać to na peceta w dużych paczkach. W przeciwnym razie to jest walka z wiatrakami.

0

Co do opóźnień to musisz in/out zrealizować 2 wątki by out nie czekał na koniec pracy in i na odwrót. Do generowania grafiki musisz z całą pewnością zaprządz GPU by nie marnować czasu CPU zależy od karty możesz użyć OpenGL albo CUDA nVidii. Jeżeli chodzi komunikacje to wpadłem na pomysł by przez entry point wywoływać metodę obcego obiektu ale to pomysł i nie wiem czy jego realizacja jest możliwa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1