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;
    }
    

Anmelden zum Antworten