Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] Odbiór i wyświetlenie danych z poru RS-232

koleszka 05 Kwi 2011 19:48 3459 13
  • #1 05 Kwi 2011 19:48
    koleszka
    Poziom 24  

    Problem jest stosunkowo prosty ale straciłem już sporo czasu aby go rozwiązać i nadal się z nim nie uporałem. Przekopałem już wiele tematów i straciłem cierpliwość bo większość przykładów jest w C# i nie wiem jak to przełożyć na C++.

    Środowisko w jakim programuje to Visual C++ 2008 expres edition (CLR). Dane odebrane z portu COM podczas obsługi zdarzenia serialPort_DataReceived chce zapisać do richTextBox1. Problem w tym że kontrolka została utworzona przez inny wątek niż ten który obsługuje port. Na ile się zorientowałem muszę skorzystać z metody Invoke aby móc zaktualizować kontrolkę z innego wątku i tu właśnie jest problem. Nie wiem jak powinna wyglądać składnia, większość przykładów jest w C#, a na stronie MDSN jest dość zawiły przykład. Czy ktoś z szanownych kolegów mógłby mi podać przykład jak mam to napisać, najlepiej w najprostszy sposób. Z tego co wyczytałem wydaje mi się, że powinno to wyglądać mniej więcej tak:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Z góry dziękuje za każdą pomoc

    0 13
  • #2 05 Kwi 2011 20:32
    skynet_2
    Poziom 26  

    A nie możesz przekazać obiektowi zajmującemu się portem referencji to obiektu GUI ?

    0
  • #3 06 Kwi 2011 14:09
    koleszka
    Poziom 24  

    skynet_2 napisał:
    A nie możesz przekazać obiektowi zajmującemu się portem referencji to obiektu GUI ?


    Jeśli da się to rozwiązać w taki sposób to mogę, tylko jak mam to zrobić?

    0
  • #4 06 Kwi 2011 14:45
    skynet_2
    Poziom 26  

    Załóżmy że masz klasy rs i gui:
    rs.h

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    rs.cpp
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #5 06 Kwi 2011 15:25
    koleszka
    Poziom 24  

    Wszystko fajnie, ale korzystam z gotowych komponentów czyli bibliotek MSDN Library .NET i pytałem jak wywołać aktualizacje kontrolki w wątku macierzystym z innego wątku. Wiec pytanie jest jak powinna wyglądać prawidłowa składnia wywołania metody Control::Invoke w języku C++.

    0
  • #7 06 Kwi 2011 16:41
    koleszka
    Poziom 24  

    skynet_2 napisał:
    Sprawdź taki przykład Control::Invoke Method (Delegate)


    Powyższy przykład przeglądałem zanim założyłem temat jest on na tyle zawiły, że nadal nie wiem jak napisać to w odniesieniu do mojego programu. Coś mi się wydaje że jednak będę musiał się sam z tym uporać albo przenieść się na C#.

    0
  • #8 06 Kwi 2011 17:08
    skynet_2
    Poziom 26  

    ^ - wskaźnik.

    W tym przykładzie do konstruktora przekazujesz wskaźnik na gui[klasa myFormControl1].

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Dalej:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    I implementacja.
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Wywołując
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    tak naprawdę wywołujesz
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Przynajmniej dla mnie tak to wygląda.

    btw. jest to strasznie pokręcone.

    0
  • #9 06 Kwi 2011 18:21
    koleszka
    Poziom 24  

    skynet_2 napisał:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    W tym fragmencie kodu tworzony jest uchwyt do GUI, tyle tylko że ja korzystam z designera i po stworzeniu nowego projektu automatycznie generowany jest następujący kod:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    rozumiem że powinienem sobie napisać metodę która będzie wpisywała tekst do richTextBox i delegata np:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    ale w którym miejscu powinienem zrobić uchwyt do GUI i jak to potem wywołać?

    skynet_2 napisał:
    btw. jest to strasznie pokręcone.


    Z tym się w pełni zgadzam i właśnie dlatego powstał ten temat

    EDIT:

    Ostatecznie i tak będzie zapis danych do pliku więc nie będzie problemu z wątkiem wiec na razie to sobie odpuszczę. Zapisze dane do zmiennej globalnej i z niej będę czytał. Jednak temat jest nadal aktualny bo to na pewno się przyda nie raz. Z tego co się zorientowałem w C# jest to o wiele łatwiej rozwiązane, gdyż jest metoda InvokeIfRequired i wystarczy wpisać coś takiego
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    i problem z głowy.

    0
  • #10 06 Kwi 2011 18:40
    skynet_2
    Poziom 26  

    Słabo się znam na bibliotece .NET zazwyczaj gui tworzę w Qt4.

    Skoro nie chcesz ruszać wygenerowanej formatki to możesz z niej dziedziczyć.
    Do nowej klasy[dziedziczącej z Form1] dopisać metody.

    Zastanawiam się czy np. jak zedytujesz klasę Form1 i poprawisz coś w gui to przypadkiem Visual C++ 2008 nie zaktualizuje tylko InitializeComponent.

    Mam VC++ 2008 zainstalowany na innym systemie przeloguje się i sprawdzę jak to wygląda.

    0
  • #11 06 Kwi 2011 19:16
    koleszka
    Poziom 24  

    Szczerze to na co dzień nie pisze aplikacji windowsowych, raczej programuje mikrokontrolery. Wcześniej proste aplikacje robiłem w Borland C++ Builder i tam nie było takiego problemu. W .Net doszli do wniosku, że kontrolki może edytować tylko ten wątek który je utworzył, co jest dość logiczne i pozwala uniknąć wielu błędów, ale jak widać przysparza innych problemów.

    Dodano po 29 [minuty]:

    Zainstalowałem Visual C# 2008 Express Edition i skorzystałem z przykładu podanego Tutaj. Działa jak należy jednak temat zostawiam otwarty, bo być może ktoś będzie wiedział jak zrobić to w prosty sposób w C++.

    0
  • #12 06 Kwi 2011 19:18
    skynet_2
    Poziom 26  

    Pozwól że spytam pisałeś jakieś programy obiektowe?

    Co do tego problemu to

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    i masz globalną metodę setTextFromRS.

    Jeżeli możesz spróbuj Qt4, do tego bardzo fajne IDE QtCreator.
    Tworzenie programów z Gui w Qt4 jest banalnie proste i nie masz tak jakiś udziwnień jak ^.

    0
  • #13 06 Kwi 2011 19:33
    koleszka
    Poziom 24  

    skynet_2 napisał:
    Pozwól że spytam pisałeś jakieś programy obiektowe?

    Oczywiście że tak, ale nigdy pod GUI tylko zawsze pod konsolę. Na wątkach też trochę działałem ale w Java i jeszcze nie miałem problemu z błędem typu aktualizacja kontrolki z innego wątku.

    Co do globalnej metody to niestety nie działa bo problem jest w tym że wywołuje ją wątek który nie utworzył kontrolki, a więc nie może jej edytować. Przy takim rozwiązaniu nadal wyrzuca błąd:
    Cytat:
    Nieprawidłowa operacja między wątkami: do formantu 'richTextBox1' uzyskiwany jest dostęp z wątku innego niż wątek, w którym został utworzony.

    Więc bez Invoke się nie obędzie i problem dalej zostaje nie rozwiązany, a ja przenoszę się na C#. Zobaczę jeszcze ten Qt4 może mi się spodoba.

    0
  • Pomocny post
    #14 07 Kwi 2011 01:56
    skynet_2
    Poziom 26  

    Tutaj masz tutek do programowania w Qt4, tworzenie programu z dodatkowym wątkiem.

    Trochę byłem zmęczony więc prędkość pisania nie jest rewelacyjna.

    960x768@4 min otworzysz np. za pomocą vlc.

    _edit: niestety film dalej się nie ładuje więc zostawiam tylko załącznik.

    0