Bonjour,

dans le cadre d'un projet C/GTK+ pour notre école, nous devons mettre en oeuvre la visualisation de la propagation d'ondes électromagnétiques(dans notre exemple représenté par un sinus). On visualise bien la propagation, le seul souci vient du rafraichissement de la courbe avec "le threads". Au lieu de réeffacer à* chaque fois la courbe pour la remplacer par la nouvelle, il redessine par dessus (on utilise pourtant la fonction "gdk_window_invalidate_rect" dans le threads).


Sauriez vous d'où pourrait venir le problème?
Merci d'avance,

P.S: ci-joint une partie du programme "callbacks.c"
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/***************************
/ Thread
**************************/
 
 
void *dessine_thread (void *args)
{
  GtkWidget *dessin = lookup_widget(GTK_WIDGET(args), "drawingarea1");
 
  while(1)                               // boucle infinie du thread
  {
    if(dess)
    {
      if(!arret)
      {
        temps += 1;
        gdk_window_invalidate_rect(dessin->window, NULL, FALSE);
      }
      /*if(temps > larg-20)        
      {
        dess = FALSE;
        //redess = FALSE;
      }*/
    }
    usleep(10000);                   // attendre entre deux redessiner
  }
  return NULL;
}
 
 
 
 
 
 
/*********************************************************************************
/ Expose Event
/********************************************************************************/
 
gboolean
on_drawingarea1_expose_event           (GtkWidget       *widget,
                                        GdkEventExpose  *event,
                                        gpointer         user_data)
 
 
{
 GdkGC *gc;
 
  gc = gdk_gc_new(widget->window);
  gdk_window_get_size(GDK_WINDOW(widget->window), &larg, &haut); //Récupération de des dimensions de la fenêtre
  gdk_draw_line(widget->window, gc, 0, haut/2, larg, haut/2);
 
 
    //Création de l'interface entre 2 milieux
  if(lignemilieu == TRUE)
    {
      gdk_draw_line(widget->window, gc, larg/2, haut, larg/2, 0);
    }
 
 //Création des interfaces entre 3 milieux
 
 // valeurded = gtk_entry_get_text(GTK_ENTRY(pEntry));
 
  if(affichagetranche == TRUE)
    {
      gdk_draw_line(widget->window, gc, larg/2, haut, larg/2, 0);
      gdk_draw_line(widget->window, gc, larg/2, haut, larg/2 + tranche, 0);
    }
 
             /**************************************
             / Affichage de l'onde
             /***************************************/
 
  gint ite,i;
  gint x_precedent, y_precedent;
  gdouble ez[larg], hy[larg];
     for(ite=0; ite<larg;ite++)
       {
         ez[ite]= haut/2;
         hy[ite]= haut/2;  //initialisation des tableaux
       }
  gdouble imp0=377.0; 
  gint mm; 
  gint temps_max = 100;
  gint abs=1;
 
 
 
 
  /*Incrémentation du temps*/
   for (i=0; i < temps; i++)
    {
        ez[0]=40*sin((gdouble)((i*2*3.14)/(gdouble)(larg))) + haut/2; //le haut/2 permet de centrer le graphique
 
 
 
       for (mm=0; mm<larg-1; mm++)        //Mise Ã* jour de champ magnétique
          {
           hy[mm] = hy[mm] + (ez[mm+1] - ez[mm])/imp0; 
          }
 
 
       for (mm=1; mm<larg; mm++)        //Mise Ã* jour de champ électrique
          {
           ez[mm] = ez[mm] + imp0*(hy[mm] - hy[mm-1]); 
          }
 
 
 
       x_precedent=0;       //dessin de la courbe dans l'interface pour chaque instant
       y_precedent=ez[0]; 
       for (mm=0; mm< larg-1; mm++)
         {
           gdk_draw_line(widget->window, gc, x_precedent, y_precedent, x_precedent+1 ,ez[mm+1]);
           x_precedent++;
           y_precedent = ez[mm+1];
         }
   }
  usleep(10000);
  return FALSE;
}