Gtk3 und Threads
-
Hallo,
ich habe ein kurzes Beispielprogramm geschrieben, ohne Konstrukte aus den Gtk-Thread-Paketen zu verwenden. So wie es jetzt geschrieben ist, stürzt es sofort nach Programmstart ab (außer es wird mit valgrind gestartet :)).
#include <stdlib.h> #include <gtk/gtk.h> int clockMinW = 1; int clockSecW = 59; char *label; GtkWidget* mainWindow; GtkWidget* clockWhite; void *Thread(void* arg) { while(1) { sprintf(label,"%s%i:%i%s","<span background=\"#FFFFFF\" foreground=\"#00b0ff\" size=\"70000\">",clockMinW,clockSecW,"</span>"); gtk_label_set_markup(GTK_LABEL(clockWhite),label); gtk_widget_queue_draw(mainWindow); } } int main(int argc, char **argv) { gtk_init(&argc,&argv); label = malloc(200); clockWhite = gtk_label_new(""); mainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(mainWindow),600,200); gtk_container_add(GTK_CONTAINER(mainWindow),clockWhite); g_signal_connect(mainWindow,"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show(clockWhite); gtk_widget_show(mainWindow); pthread_t tidMov; int rc = pthread_create(&tidMov,NULL,Thread,NULL); if(rc != 0) { fprintf(stderr,"Thread konnte nicht gestartet werden!"); } gtk_main(); return 0; }
Leider habe ich im Internet nichts finden können, das mir hier weiterhilft. Sämtliche Seiten beziehen sich auf die deprecated-Methoden von vor GTK-3.6. Wie muss ich also den Quelltext anpassen, sodass er Gtk3.8-Konform ist (und überhaupt läuft ;)) ?
Vielen Dank :).
-
Dein Programm lässt sich unterhalb von GTK3.8 (GTK2 und GTK3) problemlos umwandeln und ausführen (es gibt ein paar Pango Meldungen) diese musst Du eben anschauen...
Mein Tipp: Lass "noch" die Finger von GTK3.8... Vor allem bei der Nachinstallation via "automatischer Update"... Es gibt nur Probleme mit den zugehörigen Abhängigkeiten.Ach ja - wegen Deinem Problem werde ich mir kein GTK+3.8 installieren
-
Danke für deine Antwort. Nach weiteren Recherchen habe ich es jetzt geschafft. Der Code sieht nun so aus:
#include <stdlib.h> #include <gtk/gtk.h> int clockMinW = 1; int clockSecW = 59; char *label; GtkWidget* mainWindow; GtkWidget* clockWhite; gboolean process(void *); void *Thread(void* arg) { while(1) { sprintf(label,"%s%i:%i%s","<span background=\"#FFFFFF\" foreground=\"#00b0ff\" size=\"70000\">",clockMinW,clockSecW,"</span>"); g_idle_add((GSourceFunc)process,NULL); } } gboolean process(void *arg) { gtk_label_set_markup(GTK_LABEL(clockWhite),label); gtk_widget_queue_draw(mainWindow); } int main(int argc, char **argv) { gtk_init(&argc,&argv); label = malloc(200); clockWhite = gtk_label_new(""); mainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(mainWindow),600,200); gtk_container_add(GTK_CONTAINER(mainWindow),clockWhite); g_signal_connect(mainWindow,"destroy",G_CALLBACK(gtk_main_quit),NULL); gtk_widget_show(clockWhite); gtk_widget_show(mainWindow); pthread_t tidMov; int rc = pthread_create(&tidMov,NULL,Thread,NULL); if(rc != 0) { fprintf(stderr,"Thread konnte nicht gestartet werden!"); } gtk_main(); return 0; }