wxWidgets - odświerzanie elementu co pewien czas

0

Witam,

Potrzebuję aby aplikacja co pewien czas komunikowała się z pewnym urządzeniem a następnie pobrane wartości wyświetlała w np. oknie tekstowym.

Jak to można zrobić? Teoretycznie można utworzyć nowy wątek aby on odwalał tą robotę, ale mam problem bo potrzebne elementy okna są w przestrzeni private.
Da się mimo to ich użyć czy trzeba je przenieść?

Pytam ponieważ pracuje w środowisku Code::Blocks gdzie z automatu część rzeczy za mnie robi i nie chciał bym narobić tam bałaganu.
Czy raczej nie ma wyjścia i trzeba to przenieść?

I pytanie drugie, czy takie odwołanie do obiektu z poziomu innego wątku jest poprawne?

RSGuiFrame::LogDev->AppendText( wxString::Format(wxT("thread\n")) );

W większości programuje urządzenia embedded i z C++ praktycznie nie mam styczności, więc ciężko mi to na razie ogarnąć a muszę napisać aplikację także na PC.

0

A zwykły timer (wxTimer) nie wystarczy?

0

No fakt, o tym nie pomyślałem...

Zatrzymanie timer'a możliwe jest tylko w nim?

Mam jeszcze nieco inne pytanie, jak wywołać funkcję np. od przycisku?

Tzn wciśnięcie przycisku powoduje wykonanie pewnego kodu i teraz najchętniej bym wywołał to wciśnięcie z innego miejsca.

0

Zatrzymanie timer'a możliwe jest tylko w nim?

Co masz na myśli pisząc "tylko w nim"?

jak wywołać funkcję np. od przycisku?

Tak, jak wywołujesz każdą inną metodę. A jeśli chcesz to zrobić via system zdarzeniowy, wtedy zrób tak:

wxButton* button;
...

wxCommandEvent event(wxEVT_BUTTON, button->GetId());

event.SetEventObject(button);
button->ProcessEvent(event);
0

Z timerem sobie poradziłem, wiem już jak nim się posługiwać.

Funkcja od przycisku u mnie wygląda tak:

void RSGuiFrame::ProgramingProces(wxCommandEvent& event)
{
...
} 

I sprawdziłem, jednak nie jest to Button a wxToolBar.

     wxCommandEvent DisConnectEvent(wxEVT_BUTTON, ToolBarConnect->GetId());

    DisConnectEvent.SetEventObject(ToolBarConnect);
    ToolBarConnect->ProcessEvent(DisConnectEvent);

Niestety zatrzymuje się na ostatniej linii, ToolBarConnect nie posiada elementu ProcessEvent.

0

wxToolBar wysyła zdarzenie wxEVT_TOOL a nie wxEVT_BUTTON. Jako id musisz za pewne podać id przycisku z toolbara.

Z drugiej strony, nie wystarczy tak:

wxCommandEvent event(wxEVT_TOOL, 0);

ProgramingProces(event);

?

ToolBarConnect nie posiada elementu ProcessEvent.

A czym jest ToolBarConnect? wxToolBar dziedziczy po wxEvtHandler, więc metodę ProcessEvent powinien mieć.

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