Bonjour,

J'ai un thread chargé d'insérer des lignes dans un treeview et de faire progresser une progressbar. J'essaye de migrer vers gtk 3, où les fonctions gdk_threads_enter() et gdk_threads_leave() sont dépréciées, j'aimerais adapter le code.

Seulement voilà, sans l'utilisation de ces fonctions, l'interface est instable et plante. J'ai essayé de lancer le thread avec g_idle_add(), g_main_context_invoke() et gdk_threads_add_idle(), mais ces fonctions bloquent l'interface.

Je ne peux pas me passer de thread, car sinon le callback bloque l'interface.

Voici un programme de test, qui modifie le label d'un bouton avec un thread, un deuxième click sur le bouton permet d’arrêter le thread, le programme plante quand on essaye de redimensionner la fenêtre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <gtk/gtk.h>
#include <gdk/gdk.h>
 
#include <stdio.h>
 
int annuler = 0;
int stop = 0;
 
gpointer threadwhile(gpointer data) {
  GtkButton * b = (GtkButton*) data;
  int count = 0;
  char buffer[100];
 
    while(1) {
      if(stop == 1) break;
      printf("\n test %d",count);
      sprintf(buffer,"test %d",count);
      gdk_threads_enter();
      gtk_button_set_label(b,buffer);
      gdk_threads_leave();
      count ++;
    }
    annuler = 0;
    stop = 0;
    return FALSE;
}
 
void on_button_clicked(GtkButton * button, gpointer data) {
 
  if(annuler == 1) stop = 1;
  else {
    g_thread_new(NULL,threadwhile,button);
    annuler = 1;
  }
}
 
 
GtkWidget * create_window1() {
  GtkWidget * window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window1), "test gtk3");
 
  GtkWidget * vbox12 = gtk_vbox_new (FALSE, 0);
  gtk_widget_show (vbox12);
  gtk_container_add (GTK_CONTAINER (window1), vbox12);
 
  GtkWidget * button = gtk_button_new();
  gtk_button_set_label(GTK_BUTTON(button),"compile");
  g_signal_connect ((gpointer) button, "clicked",
                    G_CALLBACK (on_button_clicked),
                    NULL);
  gtk_widget_show (button);
  gtk_container_add (GTK_CONTAINER (vbox12), button);
 
  return window1;
}
 
 
int main(int argc, char *argv[]) {
 
  gdk_threads_init ();
  gdk_threads_enter ();
 
  gtk_init (&argc, &argv);
 
  GtkWidget * window1 = create_window1 ();
  gtk_widget_show (window1);
  g_signal_connect ((gpointer) window1, "destroy", G_CALLBACK(gtk_main_quit), NULL);
 
  gtk_main ();
  gdk_threads_leave();
}