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 :

GTK + thread = problèmes ?


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut GTK + thread = problèmes ?
    Bonjour,

    Gtk me rend fou. Je m'explique.

    j'ai 2 threads:

    -GTK qui créé des "zone = gtk_vbox_new(FALSE,10);" avec ce qui va avec.
    -event : qui remplit ces zones avec des "view = gtk_text_view_new ();"
    je lance le "event" juste avant que GTK rentre dans la boucle gtk_main.(condwait)
    et là, rien ne s'affiche, je ne sais pas comment architecturer le programme pour que les modifications envoyées par "event" soient prises en compte par gtk
    si quelqu'un à une idée, ou une piste, un tuto que je n'ai pas trouvé.

    Merci

    salutation, Philippe

    PS: hésité pas si vous avez des questions, si je me suis mal exprimé

  2. #2
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut
    Hm... GTK et le multithread fait couler beaucoup d'encre... J'ai eu ce genre de problèmes récement et en fait ça se résoud facilement.

    Est-ce que tu as commencé par lire ça http://library.gnome.org/devel/gdk/u...k-Threads.html ?

    Si ça ne répond pas à ta question ou si tu n'arrives pas à comprendre la doc n'hésite pas à demander des éclaircissements.

  3. #3
    Membre Expert
    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
    Par défaut
    Il ne faut pas appeler des fonctions gtk+ depuis 2 threads distincts. Du moins pas sans s'être très attentivement renseigné sur le sujet.

  4. #4
    Membre Expert
    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
    Par défaut
    Il attend quoi ton 2nd thread comme evt au juste? Tu ne peux pas tout faire dans un seul thread?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    Bonjour,

    Désolé pour le retard, je vais apparemment devoir forcer sur la langue de Shakespear... je vais prendre mon temps. Mais question bête, GTK et GDK, c'est des copains?

    Pour répondre à la question de la nécessité des thread, oui il le faut. Car il faut que je scrute plusieurs entrées externe. donc il faut qu'il attende tous (les threads) quelques choses en même temps.

    Merci pour vos réponses.

    salutation, Philippe

  6. #6
    Membre Expert
    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
    Par défaut
    Tu y accèdes comment à tes entrées externes ? Via un file descriptor sur lequel tu fais des read ? Ou autrement ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    j'ai une boucle qui remplit une pile avec des messages qui viennent d'une librairie de communication, ou d'un fichier cvs qui est lu.

    et je lis cette pile avec une boucle qui appelle différent fonction selon ce qui est mis dans le message

    exemple -> message = 2541845

    "25" fonction afficher heure,"4" taille de l'heure, "1845" l'heure

    c'est un peu plus complexe, mais c'est ça l'idée.

    Sinon j'ai bien lu le tuto et lors de la modification des "box" par ma boucle externe à GTK. ça plante, je n'ai pas encore trouvé pourquoi.

    Salutation

  8. #8
    Membre Expert
    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
    Par défaut
    Hmm, tu dois pouvoir mettre tes msgs dans une GAsyncQueue et lire le contenu de cette pile dans le thread principal via un callback ajouté avec g_idle_add ou g_timeout_add ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    Je ne connais pas ce type de pile. Mais si elle est faite pour fonctionner avec gtk je vais essayer de mettre cela en place.

    je lis la datasheet et go.

    si je comprends bien

    je vais avoir un programme principal où j'aurais la pile et la création de l'ihm et des threads pour remplir la pile. Mais ne vais-je pas avoir les mêmes problèmes pour remplir la pile que ce que j'ai pour remplir les zones?

    Merci beaucoup pour ton aide

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    Petite question histoire d'être sur avant de chambouler le code.

    au lieu de faire un thread pour ma boucle d'événement, je vais la déclarer en g_idle_add pour qu'elle s'exécute quand les autres "fonctions" ne font rien.

    et elle pourra modifier l'affichage aisément, car elle sera dans le même thread que gtk_main?

    c'est bien ça ?

    Merci

  11. #11
    Membre Expert
    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
    Par défaut
    Oui

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    Merci pour ton aide...

    je m'occupe de tout cela, je mettrais le topic en "résolu" après.

    au cas où j'ai encore de questions, on sait jamais

    Bonne journée.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    ça marche presque, j'ai un autre problème. C'est plus un problème pour la section débutant, mais puisque je suis lancé ici, je continue. Enfin si j'ai le droit...

    j'ai donc changé l'architecture. J'arrive au passage des paramètre en argument. Et malgré mes relectures de la section pointer, je ne m'en sorts pas.

    segmentation fault

    la struct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct data_to_event
    {
        GtkWidget *zone;
        GtkWidget *main_fenetre;
        char *buffer;
        pile **pile_dattente;
        char *test;
    }S_C_afficher_text;
    le main :
    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
    /**Initialisation de GTK /GDK************************************/
     
        g_thread_init (NULL);
        gdk_threads_init ();
        gdk_threads_enter ();
        gtk_init(&argc,&argv);
    /*******************************************************************/
     
        GtkWidget *main_fenetre = NULL;
        //déclaration de la pile et remplissage de la pile avec le fichier CVS
        pile *pile_dattente=NULL;
        lire_cvs (&pile_dattente);
        View(pile_dattente);
        //création de la strcuture a passer à la fonction recup action (g_idle_add)
        S_C_afficher_text  data_to_event;
        data_to_event.main_fenetre=main_fenetre;
        data_to_event.pile_dattente=&pile_dattente;
        data_to_event.test="666";
        data_to_event.zone=zone1;
        data_to_event.buffer="LE_BUFFER";
        printf("\njuste aprés l'init on a test :|%s|\n",data_to_event.test);
        //déclaration de la fonction appelé lorsque toutes les autre sont inactivent
        g_idle_add((GSourceFunc)recup_action,&data_to_event);
    le callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void  *recup_action (GtkWidget *Widget,gpointer *Data)
    {
        //récupération des arguments et insertion dans la une structure similaire
        S_C_afficher_text *data_local= (S_C_afficher_text*) Data;
        printf("int_test = |%s|",data_local->test); //il est ici le seg. fault
    Et ça fait 2 bonnes heures que je cherche. Mais rien ...
    Si quelqu'un a une idée ou s'il vous faut un compilable. Demandez-moi, je vous le posterais ce soir, ou demain matin.


    Merci
    Salutation Philippe

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Ta variable data_to_event est déclarée en local. Si la fonction dans laquelle elle est déclarée se termine, elle est aussi détruite. Alloue plutôt un espace dans le tas pour elle est passe directement son pointeur au CallBack.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    Merci pour ta réponse.

    Cette variable est déclarée dans le main. Elle ne ce détruit donc pas il me semble. Non ?

    Et c'est quoi le "tas" je ne connais pas le terme.

    Bonne soirée.

    Salutation

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Il existe deux "types" de mémoire lors de l'éxécution d'un programme:
    1. la pile : mémoire réservée par la fonction. Toute déclaration de variable dans une fonction se fait donc dans la pile. Une fois la fonction finie, cette mémoire est rendue au système.
    2. le tas : le reste de la mémoire du PC. La fonction pour s'octroyer un peu de mémoire est typiquement malloc();. D'autres fonctions y sont associées.

    En effet si ta variable est déclarée dans le main elle est toujours viable. Le problème vient peut être des déclarations des char*. déclare-les en const char*.
    Pour ma part je préfère utiliser g_strdup_printf(); de la Glib. Elle alloue dans le tas (maintenant tu sais ce que sait ) mais au moins pas de soucis pour les utiliser.

  17. #17
    Membre Expert
    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
    Par défaut
    Y a peut être des soucis avec la façon dont tu ajoutes des éléments dans ta pile.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    Bonjour,

    merci pour tes lumières

    j'ai mis en place la malloc. Mais ça ne suffit pas. C'est un problème de pointeurs. J'en suis presque sûr, mais je ne trouve pas la solution. ça doit être quelque chose du type ->(*truck) mais je n'arrive pas à trouver.

    si quelqu'un à la solution en voyant le code je suis preneur, je commence à saturer.

    Merci

    Bonne journée, Philippe

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 47
    Par défaut
    Merci de m'aider

    mais je ne pense pas qu'il y ai un problème avec la pile car cette partie affiche correctement :
    void *recup_action (gpointer *Data):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        pile *pile_dattente=(pile*)malloc(sizeof(pile));
        pile_dattente=data_local->pile_dattente;
        View(pile_dattente);
    mais je pense que c'est dans la façon passer les pointeurs, je sais que je ne suis pas très bon sur ça.

  20. #20
    Membre Expert
    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
    Par défaut
    Faut pas réimplémenter une structure de pile à la main mais utiliser les fonctions fournies par la glib alors si t'es pas très à l'aise avec les pointeurs valgrind devrait t'expliquer ce qui ne va pas si t'es sous linux.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. GTK * thread = Encore des problèmes
    Par PhilippeHen dans le forum GTK+ avec C & C++
    Réponses: 14
    Dernier message: 13/08/2009, 11h00
  2. [VB.Net][Threading] Problème de parent ...
    Par maitrebn dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/01/2006, 11h05
  3. Thread problème pour l'arreter
    Par rvzip64 dans le forum Langage
    Réponses: 8
    Dernier message: 12/07/2005, 10h51
  4. [Thread]Problème de processus
    Par berg dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2005, 20h40
  5. Thread--> problème avec ThreadProc
    Par stof dans le forum MFC
    Réponses: 33
    Dernier message: 08/06/2005, 13h47

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