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 :

Problème d'affichage fenêtre GTK


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut Problème d'affichage fenêtre GTK
    Salut à tous

    J'ai un problème lors de l'affichage de ma fenêtre GTK.
    J'ai créé un code en C qui fonctionne parfaitement, et une interface graphique en GTK à coté. Maintenant, ce que je souhaiterais faire, c'est réunir les deux.

    En essayant de faire ça, ma fenêtre GTK s'affiche bien, mais il n'y a rien dedans. C'est seulement à la fin de l'exécution du code qu'enfin les données apparaissent.

    Le but de ce programme est d'actualiser une fenêtre GTK en fonction des valeurs de certains labels. Ces labels sont modifiés en fonction des données qui sont lues dans un fichier texte. En gros, le code que j'ai créé fait :

    lecture des valeurs contenues dans la première ligne du fichier
    Conversion Hexa->decimal
    Ecriture valeur deciumale dans un nouveau fichier
    Recherche des minimums parmis les valeurs de la premiere ligne
    passage ligne suivante et on recommence depuis le début


    J'ai lu sur certains forums qu'il faut rendre la main très régulièrement au gtk_main() pour qu'il puisse afficher ces données. Comment faire celà ? On parle assez souvent de la fonction g_idle_add et g_timeout_add, mais je ne sais pas trop comment l'appliquer à mon problème.

    Merci pour votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Salut, si j'ai bien compris ton programme, il doit faire ça :

    1) Lire une ligne d'un fichier texte

    2) Mettre à jour les valeurs des labels

    3) Actualiser la fenêtre graphique

    4) Recommencer jusqu'à la fin du fichier


    Le problème comme tu dit, c'est que tu va lire trop rapidement toutes les lignes de ton fichier et ça sera arrivé à la fin avant que tu n'ai pu actualiser ta fenêtre.

    Donc je penserai procéder comme ça :

    Utiliser un timer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    guint               g_timeout_add                       (guint interval,
                                                             GSourceFunc function,
                                                             gpointer data);
    Où l'intervalle est le temps en millisecondes entre lequel tu va appeler ta fonction et data représente les données passées en paramètres à ta fonction.

    Donc par exemple, si tu décides d'actualiser ta fenêtre toutes les secondes, il faudra ajouter le timer suivant dans ton programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add (1000,(gpointer)actualiser,data);
    Data représente les widgets ton application a besoin pour dessiner (les labels, la zone de dessin,...)

    Donc tu peux tout regrouper dans une structure et lui passer cette structure en paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct Necessaire {
      GtkWidget *pDessin;
      GtkWidget *pLabel1;
      ...
    };
    Enfin la fonction actualiser doit ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    gint actualiser(gpointer data){
     
    /* Lecture de la ligne suivante dans ton fichier */
     
    /* Mise à jour des labels */
     
      gtk_label_set_text(GtkLabel *label, const gchar *str);
     
    /* Actualiser la fenêtre avec tes opérations de dessin */
     
     
    return TRUE; //pour que le timer continue, sinon si la fonction renvoie FALSE le timer s'arrête
    }
    Voilà, en ésperant avoir été clair, bon courage

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut
    Merci beaucoup pour ta réponse Nemo, je vais essayer de travailler en suivant tes conseils.

    J'ai toutefois quelques petites questions à te poser :

    Dans la fonction gint actualiser(), est il possible de lui passer plusieurs paramètres ? Car lorsque tu appelles la fonction actualiser dans la fonction g_timeout_add, tu ne passes pas le paramètre (data), d'ou ma question...

    Je voudrais pouvoir y rajouter un compteur, car quand je vais devoir lire les données dans le fichier, je vais devoir fermer ce fichier une fois que j'aurai lu la première ligne. Du coup, lorsque je le rouvre à l'itération suivante, le curseur se placera toujours à la première ligne, et me lira toujours les mêmes données. De plus, il faudrait aussi lui passer la structure en paramètre pour pouvoir travailler sur les champs des labels, et ainsi les actualiser.

    Merci par avance

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    1) Pour le passage de plusieurs paramètres je ne pense pas que ça soit possible directement car le prototype d'une fonction associée à un timer est toujours le même il prend juste comme argument un gpointer.

    Tu pourrais déclarer tout ce dont tu as besoin en variable globale mais c'est déconseillé. D'où l'intéret de la structure : tu mets dans la structure tout ce dont tu pourrais avoir besoin : les labels, les zones de dessin, le nom du fichier dans lequel tu vas lire,...

    Et lorsque tu appelles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_timeout_add (1000,(gpointer)actualiser,data);
    Il suffit que data représente ta structure définie dans le main; en gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct Necessaire {
      GtkWidget* pLabel1;
      GtkWidget* pLabel2;
      GtkWidget* pZoneDessin1;
      GtkWidget* pZoneDessin2;
      FILE *f;
      ...
    };
    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
     
    int main(int argc, char* argv[])
    {
     
      GtkWidget *pWindow;
      gchar *sTempLabel;
     
      struct Necessaire *fenetre=NULL;
      fenetre = g_malloc(sizeof(struct Necessaire));
     
      sTempLabel = g_strdup_printf("Rythme");
      fenetre->pLabel1 = gtk_label_new(sTempLabel);
     
    /* et pareil pour les autres paramètres que tu dois lui passer */
     
    /* puis tu crées le timer à la fin */
     
      g_timeout_add(1000,(gpointer)actualiser,fenetre); //on lui passe la structure en paramètre
     
      gtk_widget_show_all(pWindow);
     
      gtk_main();
     
    return 0;
    }
    Et enfin voici le code de la fonction appelée :

    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
     
    gint actualiser(gpointer data){
     
    // On récupère les informations 
      struct Necessaire *fenetre;
      fenetre = (struct Necessaire*)data;
     
    // Et maintenant tu y a accés
     
    /* Lecture de la ligne suivante dans ton fichier */
     
    /* Mise à jour des labels */
     
    /* Actualiser la fenêtre avec tes opérations de dessin */
     
     
    return TRUE; //pour que le timer continue, sinon si la fonction renvoie FALSE le timer s'arrête
    }
    2) Pour le compteur c'est simple (j'ai découvert ça y'a quelques semaines lol), il suffit d'utiliser une variable avec le mot clé static que tu définis dans la fonction actualiser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static gint ligne = 1;
    Ce qui va se passer, c'est qu'elle sera initialisée à 1 (1ere ligne) et lorsque tu quittes ta fonction elle gardera en mémoire cette valeur
    N'oublie pas de l'incrémenter à chaque passage dans actualiser donc rajoute à la fin : ligne++;


    Voilà j'espere que ça va marcher comme ça.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut
    Merci pour tes conseils NeMo_O, je vais essayer d'appliquer tout ça à mon code ! Je te tiens au courant

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut
    Salut NeMo_O !
    Juste un message pour te remercier de tes conseils, mon prog marche nickel !
    Encore merci pour tout

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Hello content pour toi

    Sinan juste pour info, ton compteur de ligne pour savoir où tu en es dans le fichier, je ne sais pas comment tu l'as fait mais je retire ce que j'ai dit sur les variables static.

    En effet, ça marche et c'est bien pratique mais j'ai lu partout que c'était appelé "quick & dirty " donc en gros on veut pas se casser la tête à trouver une autre methode et comme c'est pratique on utilise static. Mais pour la réutilisabilité du code, il vaut mieux coder par un autre moyen !

    Donc par exemple, tu rajoute le compteur dans ta structure

    PS: pense à cliquer sur le bouton " Résolu " une fois que ça marche

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 16
    Par défaut
    Citation Envoyé par NeMo_O Voir le message
    Donc par exemple, tu rajoute le compteur dans ta structure
    C'est ce que j'ai fait Thanks

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'affichage fenêtre sur une fenêtre XNA
    Par dark poulpo dans le forum C#
    Réponses: 2
    Dernier message: 03/02/2012, 09h22
  2. Problème d'affichage fenêtre popUp
    Par matt2i dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 21/07/2011, 14h38
  3. [SOLARIS] Problème d'affichage fenêtre
    Par david06600 dans le forum Solaris
    Réponses: 2
    Dernier message: 08/10/2007, 17h59
  4. Problème d'affichage: fenêtres (frames) vides!
    Par NdmaX dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 12/07/2005, 21h23
  5. [Kylix] Problème d'affichage de fenêtres
    Par Progs dans le forum EDI
    Réponses: 1
    Dernier message: 01/01/2005, 02h46

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