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+ Discussion :

Problème de GtkTable


Sujet :

GTK+

  1. #21
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Tu peux transmettre à la fonction qui sera appelée tous les n intervalles ton tableau par exemple comme ceci : gtk_timeout_add( 1000,(GtkFunction) foo, tab_jeu);.


    foo est la fonction qui sera appelée à intervalle régulier. Elle est du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gboolean (*GSourceFunc) (gpointer user_data);
    Tu pourras donc écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gboolean foo (int tab_jeu[NB_LIGNES][NB_COLONNES])
    {
    
      return TRUE; // Tant que cette fonction retourne TRUE elle est éxécutée.
    }

  2. #22
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    J'ai écrit ceci au dessus de mon main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gboolean foo (int tab_jeu[NB_LIGNES][NB_COLONNES])
    {
      return TRUE; 
    }
    Et ceci dans mon main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_timeout_add( 1000,(GtkFunction) foo, tab_jeu);
    Mais je n'indique à aucun moment que je veux que ça soit la fonction faire_descendre_piece qui s'active.. Je dois mettre ça dans cette fonction : gboolean foo (int tab_jeu[NB_LIGNES][NB_COLONNES]) ?

  3. #23
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Renomme foo en faire_descendre_piece

  4. #24
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Mais j'ai déjà une fonction qui s'appelle faire_descendre_piece dans mon projet, celle qui modifie mon tab_jeu...

  5. #25
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Alors oui tu peux l'appeler depuis foo();.

  6. #26
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Du coup, dans , j'ai une petite question.

    Je peux mettre dans la boucle plusieurs "opérations" que je veux réaliser toutes les X ms?


    Edit: Une autre question; je peux y passer d'autres paramètres que int tab_jeu?

  7. #27
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Tu peux faire ce que tu veux dans la fonction foo();. C'est une fonction comme toutes les autres homis qu'elle est appelée depuis la boucle principale de Gtk+ à intervalle régulier. Pour y passer plusieurs informations tu n'a pas d'autres choix que d'utiliser une structure qui va englober toutes les informations à transmettre.

  8. #28
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Je ne m'en sors pas..
    Voici la définition de ma structure que j'ai créé en suivant ton conseil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct
    {
        GtkWidget *laTable;
        GtkWidget *leConteneur;
        UnePiece laPiece;
        int leTableau;
     
    }Timer ;
    Voici la fonction foo avant mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gboolean foo(Timer Toutes_les_secondes)
    {
        Toutes_les_secondes.laPiece=faire_descendre_piece(Toutes_les_secondes.laTable,
                            Toutes_les_secondes.leTableau, Toutes_les_secondes.laPiece);
        gtk_widget_destroy(Toutes_les_secondes.laTable);
        Toutes_les_secondes.laTable = gtk_table_new(NB_LIGNES, NB_COLONNES, TRUE);
        gtk_container_add(Toutes_les_secondes.leConteneur, Toutes_les_secondes.laTable);
        rafraichir (Toutes_les_secondes.laTable, Toutes_les_secondes.leTableau); // C'est la fonction qui prend en compte mon tableau et qui selon les chiffres affiche des carrés de telle ou telle couleur
        return TRUE;
    }
    Voici la création d'une variable type Timer dans mon main ()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Timer Toutes_les_secondes;
        Toutes_les_secondes.laTable=table;
        Toutes_les_secondes.laPiece=piece;
        Toutes_les_secondes.leTableau=tab_jeu;
        Toutes_les_secondes.leConteneur=conteneur;
    Et voici la fonction pour le timer, à la suite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        gtk_timeout_add( 1000,(GtkFunction) foo, &Toutes_les_secondes);
    Pas d'erreurs, mais le programme cesse de fonctionner.

  9. #29
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    La variable leTableau dans la structure ne me semble pas du bon type. Tu la déclares en int alors que c'est un tableau. L'erreur vient peut être de là...

  10. #30
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    J'ai changé pas mal de trucs (j'ai par exemple intégrer le rafraichissement directement dans la faire_descendre_piece) bref du coup je n'ai plus besoin de structure.

    Est-ce qu'avec ça, je devrai voir ma pièce descendre?

    Avant le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gboolean foo(int tab_jeu[NB_LIGNES][NB_COLONNES])
    {
        faire_descendre_piece;
        return TRUE; 
    }
    Dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        gboolean foo(int tab_jeu[NB_LIGNES][NB_COLONNES]);

  11. #31
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gboolean foo(int tab_jeu[NB_LIGNES][NB_COLONNES])
    {
        faire_descendre_piece; C'est quoi exactement ?
        return TRUE; 
    }

  12. #32
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Voilà :

    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
    UnePiece faire_descendre_piece(GtkWidget *table, int tab_jeu[NB_LIGNES][NB_COLONNES], UnePiece piece) 
    {
    int i=0,j=0,cacahuete=0;
    int tab_tmp1[NB_LIGNES][NB_COLONNES];
    int tab_tmp2[NB_LIGNES][NB_COLONNES];
    memcpy(tab_tmp1,tab_jeu,(NB_LIGNES*NB_COLONNES)*sizeof(int));
    //tab_tmp1=tab_jeu;
    memcpy(tab_tmp2,nettoyer_piece_precedente(table, tab_tmp1, piece),(NB_LIGNES*NB_COLONNES)*sizeof(int));
    /*tab_tmp2=nettoyer_piece_precedente(tab_tmp1, piece*/
    memcpy(tab_tmp1,tab_tmp2,(NB_LIGNES*NB_COLONNES)*sizeof(int));
     
        for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            if ((piece.tab[i][j]!=0)&&(tab_tmp1[i+piece.pos_ligne+1][j+piece.pos_colonne]!=0))
            {
                cacahuete++;
            }
     
     }
    }
     
     
    if (cacahuete!=0)
    {
     
    piece.pos_ligne_avant=piece.pos_ligne;
    piece.pos_colonne_avant=piece.pos_colonne;
     
    }
     
    else
    {
        memcpy(tab_jeu,tab_tmp2,(NB_LIGNES*NB_COLONNES)*sizeof(int));
        for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            if (piece.tab[i][j]!=0)
            {
                            tab_jeu[i+1+piece.pos_ligne][j+piece.pos_colonne]=piece.tab[i][j];
            }
     
        }
     
    }
    piece.pos_ligne_avant=piece.pos_ligne;
    piece.pos_colonne_avant=piece.pos_colonne;
    piece.pos_ligne++;
    }
    rafraichir(table,tab_jeu[NB_LIGNES][NB_COLONNES]);
    return piece;
    }

  13. #33
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Sans trop regarder de prés ton code je trouve un peu lourd tes copies de tableau. Ne peux-tu pas simplement mémoriser quelle pièce a bougé pour ne changer que sa position dans le tableau ?

  14. #34
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Je n'ai pas essayé. Mais je sais que ça marche ^^'.
    ça changerait quoi si je mémorisai simplement la pièce?

  15. #35
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Gain de temps et de mémoire. Ca évite aussi les fuites.

    Par exemple dans ton code il me semble qu'à aucun moment tu libères les tableaux temporaires que tu alloues pourtant dans le tas.

  16. #36
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    En effet tu as raison. Je note ton conseil, et je regarderai ça si j'ai du temps plus tard, l'histoire du timer me semble plus importante, la deadline pour rendre le projet approche.

  17. #37
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Est-ce que je pourrai passer par un Sleep?

    J'ai essayé ceci dans mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    long sec=4;	 
     
    while (sec > 0)	 
    {
    gtk_widget_destroy(table);
    table = gtk_table_new(NB_LIGNES, NB_COLONNES, TRUE);
    gtk_container_add(conteneur, table);
    piece=faire_descendre_piece(table,tab_jeu,piece);
    rafraichir (table, tab_jeu);
    gtk_widget_show_all(window);
    sec--;	
    Sleep(1000);	 // 1 000 ms
    }
    Ma pièce descend effectivement de 4 crans, mais le souci c'est que pendant 4 secondes (soit la valeur de sec), ma fenêtre est toute blanche, et je n'observe donc que le résultat final au bout de 4 secondes. Pourquoi?

  18. #38
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    L'apprentissage par la découverte c'est formateur

    En effet si tu places une boucle d'attente la boucle principale Gtk+ est elle aussi en attente. De ce fait l'interface n'est plus réactive. Ce n'est donc pas la bonne solution.

    Insérer ses propres fonctions dans la boucle de Gtk+ est la bonne méthode. N'en change pas.

  19. #39
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    En effet si tu places une boucle d'attente la boucle principale Gtk+ est elle aussi en attente. De ce fait l'interface n'est plus réactive. Ce n'est donc pas la bonne solution.

    Insérer ses propres fonctions dans la boucle de Gtk+ est la bonne méthode. N'en change pas.
    Cela veut dire que je ne peux pas utiliser la fonction sleep?
    Y'a pas une fonction qui permettrait "d'endormir" ma boucle mais qui m'afficherai quand même mon interface?

  20. #40
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    g_timeout_add(); et ses dérivées répond parfaitement à tes besoins : exécuter à intervalle régulier une ou plusieurs fonctions tout en laissant l'application active.

Discussions similaires

  1. Problème : Midifier une GtkTable Par une fonction
    Par Sephiroth_060 dans le forum GTK+
    Réponses: 0
    Dernier message: 10/05/2009, 14h05
  2. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  3. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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