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 entre plusieur thread


Sujet :

GTK+ avec C & C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut GTk entre plusieur thread
    Salut,
    N'ayant pas vraiment trouvé mon bonheur dans les recherche, j'ai quelques petite question.
    Context : j'ai une application (pas moi qui l'ai écrit) multi thread avec gtk pour la partie IHM. Pour les thread, c'est pthread pour linux et thread win32 pour windows.

    Seulement après plusieurs plantage, je constate une chose qui ne me plaît pas.
    Gtk est manipulé par plusieurs thread en même temps. exemple d'un plantage avec 3 thread :
    1- thread de gtk
    2- thread qui créé une widget
    3- thread qui ajoute des widget à GTK

    A mon avis, on ne devrait pas faire cela. Par exemples en Qt il est interdit de manipuler des objets d'IHM autre que dans la thread principale.

    Voici la doc que j'ai trouvé :
    http://library.gnome.org/devel/gdk/s...html#id2923934
    question :
    1- Est ce bien là même chose pour GTK??

    2- Si je comprend bien, gdk_threads_enter()/gdk_threads_leave() pourrais résoudre le problèmes sous windows? Car sous linux les appel x11 est thread safe.

    3- si je voulais lancer la création des widget dans l'event loop, je pourrais utiliser ceci?
    http://gtk.developpez.com/faq/?page=...BOUCLE_idleadd

    4-Y aurait-il des astuces simple pour contourner ces problèmes?

    Merci

    [edit]
    correction des questions car quelque ...(he oui vendredi soir ca aide pas à comprendre)

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Salut

    Citation Envoyé par Mongaulois Voir le message
    A mon avis, on n'as pas le droit de faire cela. Par exemples en Qt il est interdit de manipuler des objets d'IHM autre que dans la thread principale.
    C'est le même principe : http://gtk.developpez.com/faq/?page=..._BOUCLE_thread

    Citation Envoyé par Mongaulois Voir le message
    3- si je voulais lancer la création de la widget, je pourrais utiliser ceci?
    http://gtk.developpez.com/faq/?page=...BOUCLE_idleadd
    C'est la méthode que je te conseille.


    Citation Envoyé par Mongaulois Voir le message
    4-Y aurait-il des astuces simple pour contourner ce problème?
    Qu'est ce qui ne te convient pas dans la méthode précédente ?

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    Qu'est ce qui ne te convient pas dans la méthode précédente ?
    J'ai corrigé quelque connerie que j'ai dit
    cette méthode me conviens

    La méthode avec gdk_threads_enter()/gdk_threads_leave() marcherait elle? car c'est la plus rapide (quoi que apparemment quelque inter-blocage facile à faire ...). C'est juste histoire de corriger rapidement avant de modifier tout cela pour faire proprement.

    Juste une dernière, sous valgrin, j'ai des memory leak et des erreurs d'accés mémoire dans GTK (version 2.8 si je me trompe pas).
    Y as t'il des chose comme cela ? ou c'est une mauvaise utilisation de GTK (ce que je pense)

    merci.

  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
    A priori la méthode décrite dans le lien que tu files marche. Même si c'est casse-gueule et il vaut mieux faire tous les appels à des méthodes gtk+ dans le même thread. Et je suis pas bien sûr que la xlib soit thread safe, en tout cas l'utilisation qu'en fait gtk+ ne doit pas l'etre.
    Il faut lancer valgrind avec G_SLICE=always-malloc, ensuite il reste qques allocations signalées par valgrind qui ne sont en fait pas problématiques, mais sinon il n'y a pas de problèmes signalés par valgrind sur des applis gtk+

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Merci des réponses.
    Je testerais G_SLICE=always-malloc.
    C'est une variable d'environnement, c'est ça?

  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
    Ouip, tout à fait. Sans ça t'as des faux positifs sur des memleaks (avec des g_slice_xxx qui apparaissent dans les 1ères lignes de la backtrace)

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut,
    Idles, timeouts, and input functions from GLib, such as g_idle_add(), are executed outside of the main GTK+ lock. So, if you need to call GTK+ inside of such a callback, you must surround the callback with a gdk_threads_enter()/gdk_threads_leave() pair or use gdk_threads_add_idle_full() which does this for you
    Si je comprend bien ce qui est écrit, il faut que j'utilise gdk_threads_enter()/gdk_threads_leave() même dans le callback donné à g_idle_add().
    Donc qu'elle est mon intérêt de l'utiliser??
    Ajouter gdk_threads_enter()/gdk_threads_leave() dans mes fonction (appelée par d'autre thread) serait identique???

    merci de vos éclaircissement.

    [edit]
    gdk_threads_add_idle () ou gdk_threads_add_idle_full semble correspondre à ce que j'ai besoin, non?

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    j'ai enfin trouvé un peu plus de doc sur GTK entre thread (no comment )
    http://library.gnome.org/devel/gtk-faq/stable/x481.html
    http://library.gnome.org/devel/gtk-faq/stable/x499.html
    http://library.gnome.org/devel/gtk-faq/stable/x491.html
    Ce que je comprend, y as deux manières d'utiliser GTK en multi thread :
    1- si j'utilise g_idle_add() pour tout les action gtk, je suis pénard. Pas de problème de thread

    2- gdk_threads_enter()/gdk_threads_leave()

    C'est bien cela?
    Le première me semble beaucoup plus propre.

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Ce que je comprend, y as deux manières d'utiliser GTK en multi thread :
    1- si j'utilise g_idle_add() pour tout les action gtk, je suis pénard. Pas de problème de thread

    2- gdk_threads_enter()/gdk_threads_leave()

    C'est bien cela?
    J'ai toujours utilisé la première solution sans soucis (par exemple pour construire l'application en affichant un splash screen, donc appel intensif à gtk)

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    J'ai toujours utilisé la première solution sans soucis (par exemple pour construire l'application en affichant un splash screen, donc appel intensif à gtk)
    ok merci. Je continue à modifier le code avec cette solution alors
    (je la trouve vraiment plus propre)

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/06/2015, 10h53
  2. partager l'instance d'une classe entre plusieurs thread ?
    Par contremaitre dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 29/07/2008, 11h53
  3. Réponses: 14
    Dernier message: 11/07/2008, 13h09
  4. partage d'une variable entre plusieurs threads
    Par baedal dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 27/02/2008, 20h33
  5. [Technique] Conflits entre plusieurs requêtes
    Par Neowile dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 24/03/2003, 09h37

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