[Solved][WxWidgets] Sterowanie skórką Wx z konsoli

0

Mam program który liczy różne rzeczy i potrafi pokazać swoje obliczenia w konsoli (ncurses), ale tworzę do niego GUI w Wx. Skóra nie ma być mądra, ma tylko wyświetlać co jej konsola karze.
Program jest obecnie 4 wątkowy, jeden wątek to WxGUI, drugi to przekazywanie poleceń do GUI reszta raczej nie istotna.
Niestety program się wykłada z niezrozumiałego dla mnie powodu.

Wątek zapisujący wywołuje takie coś

skorkaWx->ustawText(TEXT_VALUE, wartosc); 

Odbiera to metoda:

 void SkorkaWx::ustawText(int ID_ELEMENTU, std::string &tekst)
{
	wxTextCtrl *pole_tekstowe;
	wxString text_wx(tekst.c_str(), wxConvUTF8);
	switch (ID_ELEMENTU)
	{
		case  TEXT_VALUE:  pole_tekstowe = text_czas_label; 
		break; 
	}
	pole_tekstowe -> Clear();
	pole_tekstowe -> WriteText(text_wx);
}

Gdy robię tylko jeden zapis to tekst się ładnie pojawia, przy dwóch czasami pojawia się ostrzeżenie:

(program:5121): GLib-GObject-CRITICAL **: g_object_ref: assertion `object->ref_count > 0' failed

(program:5121): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed

(program:5121): Pango-CRITICAL **: pango_layout_get_text: assertion `PANGO_IS_LAYOUT (layout)' failed
 

A gdy puszczam to na dużej prędkości i jest kilka pól do uzupełnienia to kładzie się po 1-2 sekundach.

Stack Trace

Thread 4 (Thread 0x7f1ef3fff700 (LWP 5140)):
#0  0x00000037c9624add in pango_layout_get_cursor_pos () from /usr/lib64/libpango-1.0.so.0
#1  0x00000037ca2cc5cb in ?? () from /usr/lib64/libgtk-x11-2.0.so.0
#2  0x00000037ca2ccb51 in ?? () from /usr/lib64/libgtk-x11-2.0.so.0
#3  0x00000037cae1e1a6 in ?? () from /usr/lib64/libgdk-x11-2.0.so.0
#4  0x00000037c0e41e33 in g_main_context_dispatch () from /lib64/libglib-2.0.so.0
#5  0x00000037c0e42610 in ?? () from /lib64/libglib-2.0.so.0
#6  0x00000037c0e42c82 in g_main_loop_run () from /lib64/libglib-2.0.so.0
#7  0x00000037ca34b0b7 in gtk_main () from /usr/lib64/libgtk-x11-2.0.so.0
#8  0x00000037d65e74f8 in wxEventLoop::Run() () from /usr/lib64/libwx_gtk2u_core-2.8.so.0
#9  0x00000037d666499b in wxAppBase::MainLoop() () from /usr/lib64/libwx_gtk2u_core-2.8.so.0
#10 0x0000000000419729 in SkorkaWx::OnRun() () 

Ja coś źle rozumuje czy jest bug w libpango?
Jeśli nie robię Clear() to chwilę dłużej wytrzymuje program.

1

Niestety program się wykłada z niezrozumiałego dla mnie powodu.

Sprawa wydaje się być prosta - brak synchronizacji. Problem w tym, że nie powinieneś bezpośrednio odwoływać się do elementów GUI z innych wątków.

Spróbuj tak:

void SkorkaWx::ustawText(int ID_ELEMENTU, std::string &tekst)
{
	wxMutexGuiEnter();

	/* tu Twój kod */

	wxMutexGuiLeave();
}
0

Dokładnie, teraz działa idealnie.
Wielkie dzięki za pomoc :)))

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