C++ und GtK+ Problem
-
Hallo zusammen,
ich habe folgendes Problem:
Ich habe mir einen thread geschrieben des Sekunden zählt, wie bei einer Stoppuhr. Also Thread schläft mittels sleep eine Sekunde und erhöt einen Zähler. Dann aktualisiert er ein GTK Label mit dem aktuellen Zählerwert.
Klappt soweit, nur das das GTK Widget sehr sprunghaft aktualisiert wird. Wenn ich im Fenster mit der Maus kreise dann aktualisiert er es regelmässig.
Anbei mein Thread.
zeit_laeuft ist eine boolean Variable um ein Start und Pause zu ermöglichen.
Hat irgendwer von euch eine Idee woran das liegen kann?
void *start_stop_threat (void *ptr) { while(((zeit_sekunden<1800) or (zeit_sekunden>1800 and zeit_sekunden<=3600)) and (zeit_laeuft)) { zeit_sekunden++; int minuten = zeit_sekunden / 60; int sekunden = zeit_sekunden - (minuten * 60); char str1[255]; char str2[255]; if (minuten<10) { sprintf(str1, "0%d", minuten); } else { sprintf(str1, "%d", minuten); } if (sekunden<10) { sprintf(str2, "0%d", sekunden); } else { sprintf(str2, "%d", sekunden); } strcat(str1, ":"); strcat(str1, str2); char *markup; markup = g_markup_printf_escaped ("<span font_desc=\"Arial 20\">%s</span>", str1); gtk_label_set_markup (GTK_LABEL (spielzeit), markup); gtk_widget_show(spielzeit); sleep(1); } pthread_exit(NULL); }
-
Du könntest mal gtk_widget_queue_draw() testen, aber bitte bitte sichere doch deinen Zugriff auf das Widget per Mutex ab, alles andere schwört Race-Conditions und was weiß ich gerade zu hervor.
-
Hallo The-Kenny,
werde das Widget noch als Mutex einbinden, soll ja auch vernünftig laufen. Teste ja noch
Leider klappt es aber mit gtk_widget_queue_draw auch nicht. Das Label wird, wenn ich nicht wir wild mit der Maus Kreise drehe, alle 5 bis 6 Sekunden (manchmal mehr manchmal weniger) aktualisiert.Woran könnte das denn liegen?
-
hat keiner einer Idee?
-
Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
poe schrieb:
hat keiner einer Idee?
Warum jedes mal gtk_widget_show(spielzeit) in der Schleife? Die Funktion sollt eig. nur für das erstmalige Zeichnen/Anzeigen des Widgets genutzt werden.
Ohne den restlichen Code kann ich auch nicht sagen, woran's hakt, aber das Problem mit mit "Threads" und zyklischen Aktualisierungen tritt öfters auf. Siehe meinen vorletzten Post in diesem Thread: http://www.c-plusplus.net/forum/viewtopic-var-t-is-173509-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.html
Ist zwar gtkmm, kann man aber leicht auf GTK+ umschreiben.
Cheers
GPC
-
Hab jetzt mal in den Thread gtk_main_iteration_do (FALSE) aufgerufen, damit klappts, gibt aber folgende meldung
main_window[10101]: GLIB WARNING ** GLib - g_main_context_prepare(): main loop already active in another thread
Ich denke mal wenn mir einer erzählt, wie ich irgendein Event auf dem Label von Hand aufrufen kann, könnte ich mir den gtk_main_iteration_do (FALSE) aufruf sparen und gtk würde jedes mal merken das sich was getan hat an dem label. Nur: wie rufe ich manuel ein event auf, zum Beispiel das notify_motion event?
-
Hallo,
bzgl. des Problems, das du mir per Mail geschildert hast:
"To use thread_init() in your program, you have to link with the libraries that the command pkg-config --libs gthread-2.0 outputs. This is not the case for all the other thread related functions of glibmm. Those can be used without having to link with the thread libraries. (You have to link with gthread-2.0 if you actually want to use threads in your application, though.)"
aus http://gtkmm.org/docs/glibmm-2.4/docs/reference/html/group__Threads.html#gb26d01c776801f1fff00753e97af4fc7Ergo ergibt das dann:
g++ -o timer timer.cpp $(pkg-config --cflags --libs gtkmm-2.4 gthread-2.0)
poe schrieb:
Ich denke mal wenn mir einer erzählt, wie ich irgendein Event auf dem Label von Hand aufrufen kann, könnte ich mir den gtk_main_iteration_do (FALSE) aufruf sparen und gtk würde jedes mal merken das sich was getan hat an dem label. Nur: wie rufe ich manuel ein event auf, zum Beispiel das notify_motion event?
Stichwort Signal Handler und Callbacks... http://gtk.org/tutorial/x159.html
Abschnitt 3.3, 3.4 und 3.5 sind erst mal relevant.
Cheers
GPC
-
gthreads rocken, danke, klappt jetzt...