Komunikacja RS232 oparta na wątkach

0

Witam Serdecznie.

Programuję Hobbistycznie od jakiegoś czasu. Jednak dopiero niedawno przeszedłem z konsoli na okienka ;]
Na początku uczyłem się WinAPI ale sytuacja zmusiła mnie do napisania programu okienkowego jak najszybciej.
Decyzja padła na Borland C++. Pytania odnośnie problemów jakie napotykałem podczas budowy programu zadawałem tu:

http://www.elektroda.pl/rtvforum/topic2215081-30.html

Jednak pytania zaczęły być coraz to bardziej trudne i postanowiłem poprosić Was siedzących zapewne wiele lat w temacie drogich forumowiczów o pomoc.

Program we wczesnej fazie działał na Timerach ustawionych na 1ms. Postanowiłem jednak że postaram się by program działał na niezależnych wątkach. Tu oczywiście pojawiły się problemy (są one opisane na 2 i początku 3 strony w/w wątku). Szukałem w internecie informacji na temat tego jak pogodzić GUI w wątku głównym z niezależnym wątkiem jednak w języku polskim trudno cokolwiek znaleźć.

Postanowiłem poprosić Was bardziej doświadczeni koledzy o pomoc i nakierowanie mnie na użyteczne informacje lub wytłumaczenie mi w jaki sposób praktyczny rozwiązuje się tego typu problemy.

Przyznam że jeżeli chodzi o czytanie anglojęzycznych tutoriali to nie czuję się zbyt pewnie jednak staram się zrozumieć to co czytam. Przyznaję jednak że liczę na Waszą pomoc i na to że zechcecie podzielić się zemną Waszym praktycznym doświadczeniem.

W skrócie:

  • Program pisany jest w Borland C++ VCL.
  • Jego głównym zadaniem jest komunikacja z urządzeniem zewnętrznym poprzez RS-232 i wyświetlanie danych na wykresach TChart
  • Program działał na Timerach jednak chciałbym przenieść komunikację na dwa niezależne wątki a analizę danych i GUI na główny wątek programu
  • Do kolejkowania pakietów wykorzystuję kolejkę STL

Problemy:

  • Oparcie komunikacji na wątkach a szaty graficznej i całego GUI na wątku głównym(jak mam się z wątków komunikacji odnosić do pól np. Edit w wątku głównym)
  • Jak/Gdzie w wątku głównym programu umieścić kod odpowiedzialny za analizę pakietów i uaktualnianie pól np TChart i Edit? (Timer w wątku głównym?)

Jeżeli posiadacie cenne uwagi praktyczne, tutoriale lub inne źródła praktycznej wiedzy na temat wątków i GUI oraz programowania okienkowego to proszę o informacje.

Przyznam że trudno mi jest znaleźć informacje na temat w/w oraz programowania okienkowego w Windows (jak przejść z programowania konsolowego na okienkowe oraz z programu opartego na funkcjach na programowanie oparte o zdarzenia), w języku polskim i nie twierdzę że takie tematy nie istnieją jednak mi nie udało się do nich dostać.

Proszę o pomoc i nakierowaniu mnie na rozwiązanie moich problemów

0

Możesz to robić za pomocą wskaźników do kontrolek. Ale. Obsługa interfejsu graficznego powinna odbywać się w osobnym wątku, dlatego najlepiej po prostu przypisywać zwykłe wartości, a zarządzaniem wartościami niech się zajmie jeden wątek poboczny.

0

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686915(v=vs.85).aspx

Powinno pomóc.

Ogólne wskazówki:

  • Nie powinieneś używać żadnych funkcji GUI z pobocznych wątków.
  • Używasz eventów ( CreateEvent, SetEvent ), aby zakomunikować główny wątek o czymś.
  • W głównej pętli WinMain nasłuchujesz eventów za pomocą WaitForSingleObject przez, powiedzmy, 0 milisekund ( zupełnie wystarczy ). Jeśli event jest zasygnalizowany, to WinMain zmienia wygląd GUI zgodnie z danymi z wątku roboczego.
  • Choć równie dobrze można to oprzeć na Muteksach...
0

klasa TThread, oraz metoda Synchronize.

0

Zaciekawiła mnie klasa TThread. Jednak obecnie jestem w pracy i nie mam możliwości sprawdzić jej działania.
Prosiłbym kolegę o jakiś czytelny i prosty przykład jak utworzony tą metodą wątek pogodzić z kontrolką w stylu pola Edit na formatce w głównym wątku.
Talk by wątek przeprowadzał obliczenia i wyświetlał w głównym wątku w polu Edit wyniki obliczeń w pętli nieskończonej.

I zapytam od razu czy jeżeli w wątku głównym stworzę zmienną globalną w postaci kolejki STL to jak pogodzić jej obsługę przez oba lub nawet więcej wątków tak by w wątku głównym były analizowane po kolei kolejne elementy kolejki i np wyświetlane na wykresie w pętli nieskończonej a w wątku 1 dane były odczytywane z np jakiegoś strumienia i dodawane do kolejki oraz aktualizowane gui które wyświetla w polu Edit aktualną liczbę elementów w kolejce.

Z góry serdecznie dziękuję za pomoc ;)

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