IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

g_idle_add et création d'une boite de dialogue


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 87
    Points : 46
    Points
    46
    Par défaut g_idle_add et création d'une boite de dialogue
    Bonjour,

    encore et toujours ce problème de thread et g_idle_add

    j'ai un programme gtk qui lance un thread,

    ce thread s'occupe de travailler sur des données et quelques fois il a besoin d'avertir l'utilisateur grace à des fenetres gtk, je me suis inspiré d'un tutorial sur gtk, j'ai donc ceci :

    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
     
    void print_message (const gchar *format, va_list va)
    {
      gchar *message = g_strdup_vprintf (format, va);
      gchar *message_t = g_strdup_printf ("<small>%s</small>", message);
      g_free (message), message = NULL;
     
      g_idle_add (print_gidle_error,message_t);
      g_free (message_t), message_t = NULL;		 
    }
     
    gboolean print_gidle_error(gpointer data)
    {
      gchar *message_t = data;
      GtkWidget *plabel = new_label(message_t,250,15,0.5,0.5,NULL);
      GtkWidget *p_dialog = gtk_dialog_box("Message d'erreur",plabel,200,100,0);
      gtk_dialog_run (GTK_DIALOG (p_dialog));
      gtk_widget_destroy (p_dialog);  
     
      return 1;
    }
    new_label c'est une fonction perso qui permet de créer un label.

    Donc le thread principal fait son travail et appelle quelques fois la fonction :
    print_message("coucou");

    et la ce n'est pas une fenêtre gtk qui s'ouvre mais des dizaines, ca me semble normal vu le fonctionnement de gtk qui va appeler toutes les fonctions idle, dont la mienne, à chaque itération de sa boucle principale, et donc des boites de dialogues se créent indéfiniment. Il faudrait que je "dé-idle" print_gidle_error juste après sa première utilisation, mais comment ou alors trouver une autre solution ?

    merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Tu indiques via la valeur de retour (TRUE/FALSE) de ta fonction callback si elle doit continuer à être appelée ou non. Par ailleurs, ton callback sera appelé de manière asynchrone via ton g_idle_add, ie potentiellement après que print_message ait rendu la main, et g_idle_add ne fait pas de copie du paramètre user_data, donc là tu risques d'accéder à de la mémoire désallouée dans ton callback de g_idle_add

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/07/2009, 21h38
  2. Création d'une boite de dialogue
    Par sako31 dans le forum MATLAB
    Réponses: 7
    Dernier message: 07/11/2007, 15h35
  3. Réponses: 5
    Dernier message: 22/06/2007, 14h55
  4. Réponses: 18
    Dernier message: 04/12/2006, 21h22
  5. Création d'une boite de dialogue type MessageBox
    Par kurkaine dans le forum C++Builder
    Réponses: 8
    Dernier message: 25/10/2006, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo