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 :

utilisation des threads avec gtk en C sous linux


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 46
    Points : 22
    Points
    22
    Par défaut utilisation des threads avec gtk en C sous linux
    bonjour,
    j'ai voulu introduire un thread dans une application gtk , afin que celui-ci puisse écrire dans un gtkTextView
    Je n'en suis qu'à la phase de test mais ça n'a pas l'aire de fonctionner, tout se passe comme s'il n'y avait plus que le deuxième thread qui boucle en affichant un message dans la console.
    Il me semblait que normalement le main pouvait poursuivre son exécution afin d'afficher les fenêtres etc.

    Pour le thread j'utilise pthread-create(...) en invoquant la fonction créée auparavant.
    La compilation se passe bien.
    Sauf que , avec ou sans l'option de compilation -pthread ça se passe de la même manière.

    Je ne sais pas si je suis claire mais je peux joindre le source avec le makefile si nécessaire.
    Merci pour votre aide.
    zerimbak

  2. #2
    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'utilisation des threads avec Gtk+ est délicate. Généralement l'utilisation de la fonction g_timeout_add(); est suffisante pour les nécessités du service.
    Maintenant ce qui est possible de faire et de partager une donnée qui sera gérée avec les Mutex. Ainsi si la boucle Gtk+ est en train de lire/écrire cette donnée le thread attend. Une fois libérée le thread modifie la donnée.

    Lors du traitement de cette donnée par la boucle Gtk+ si la donnée est bloquée par le thread la boucle Gtk n'attend pas et poursuit son fonctionnement jusqu'à la prochaine tentative. Cette tentative de lecture peut se faire toujours via un g_timeout_add();.

    Tout ceci étant une idée parmi tant d'autres...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    J'ai opté pour les gthread, j'ai réglé le premier problème - A savoir mon thread est autonome, il envoie des message régulièrement dans la console et cela ne m'empêche pas de faire marcher mon appli gtk.
    Mais le problème est lorsque je veux que mon thread écrive dans le GtkTextView, là ça ne marche pas. Probablement un problème avec l'usage du paramètre gpointer dans la fonction;

    C'est ligne suivante dans ma fonction qui pose problème :

    pTextBuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (data))
    data étant le paramètre de ma fonction.

    Dans le main j'utilise les deux lignes suivantes pour le thread :
    g_thread_init (NULL)
    g_thread_create (f_thread, (gpointer) Entries [4], FALSE, NULL).
    Je précise que Entries est un tableau qui contient des pointeurs sur des Widget et entre autre le GtkTextView.

    Les erreurs que j'obtiens sont incompréhensibles : du style Glib-GObject-CRITICAL ....initialization assertion failed, use IA__g_type_init() prior in the function.

    zerimbak

  4. #4
    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
    Citation Envoyé par zerimbak Voir le message
    Dans le main j'utilise les deux lignes suivantes pour le thread :
    g_thread_init (NULL)
    g_thread_create (f_thread, (gpointer) Entries [4], FALSE, NULL).
    Je précise que Entries est un tableau qui contient des pointeurs sur des Widget et entre autre le GtkTextView.

    Les erreurs que j'obtiens sont incompréhensibles : du style Glib-GObject-CRITICAL ....initialization assertion failed, use IA__g_type_init() prior in the function.

    zerimbak
    On trouve dans la documentation officielle ceci :
    Please note that since version 2.24 the GObject initialization function g_type_init() initializes threads (with a NULL argument), so most applications, including those using Gtk+ will run with threads enabled. If you want a special thread implementation, make sure you call g_thread_init() before g_type_init() is called.
    Donc Il est possible que tu sois obligé d'appelé g_type_init(); avant l'appel à g_thread_init();.
    Mais avant d'en arriver là appelles-tu gtk_init(); avant g_thread_init();?

  5. #5
    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 oublies peut être d'appeler gtk_init (qui appelle g_type_init) avant de lancer ton thread, ce qui expliquerait le message d'erreur.
    Par contre, j'espère que tu as lu et que tu connais par coeur la doc concernant l'utilisation de thread avec gtk+, en particulier si tu souhaites appeler des fonctions gtk+ depuis différents threads. Sinon tu vas au devant de problèmes

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    En effet le gtk_init() était placé après l'initialisation du système de threads, donc j'ai corrigé l'erreur mais j'ai maintenant un nouveau problème ...
    J'obtiens l'erreur suivante lors de l'exécution du code :

    Gtk-CRITICAL **: gtk_text_view_get_buffer: assertion `GTK_IS_TEXT_VIEW (text_view)' failed

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    Etrange ....
    J'ai résolu le problème c'est à dire que le thread écrit bien dans mon gtk_text_view mais en même temps dans la console j'ai les erreurs suivantes :

    projet:4010): GLib-GObject-WARNING **: invalid uninstantiatable type `(null)' in cast to `GtkTextView'

    (projet:4010): Gtk-CRITICAL **: gtk_text_view_get_buffer: assertion `GTK_IS_TEXT_VIEW (text_view)' failed

    (projet:4010): Gtk-CRITICAL **: gtk_text_buffer_get_end_iter: assertion `GTK_IS_TEXT_BUFFER (buffer)' failed

    (projet:4010): Gtk-CRITICAL **: gtk_text_buffer_insert: assertion `GTK_IS_TEXT_BUFFER (buffer)' failed

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    C'est bon le problème est résolu, c'était juste un problème de positionnement de la création du thread dans le main.
    Donc ça marche !! Enfin en apparence en tout cas, mais je suis interpelé par la remarque de teuf13, quel genre de problème suis-je susceptible de rencontrer ?

  9. #9
    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
    Des crashes plus ou moins aléatoires, des widgets qui ne se redessinent pas sont les symptômes les plus courants quand tu utilisent des fonctions gtk+ depuis 2 threads en simultané sans faire gaffe. J'espère que ça n'est pas ce que fait ton code, ce qui simplifie grandement les choses: )

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 46
    Points : 22
    Points
    22
    Par défaut
    Et donc la solution est d'utiliser des mutex pour éviter les crash ?

  11. #11
    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
    soit ça, soit faire tous les appels gtk+ depuis le thread où tourne la main loop, g_idle_add étant très utile pour ça (tu peux l'appeler depuis un thread pour faire exécuter une fonction depuis le thread où tourne la mainloop)

Discussions similaires

  1. utilisation des threads avec les ejb
    Par saylar222 dans le forum Java EE
    Réponses: 0
    Dernier message: 15/06/2012, 16h35
  2. utilisation des threads posix (sous linux)
    Par Dom_the_quaker dans le forum C++
    Réponses: 1
    Dernier message: 27/05/2008, 11h09
  3. Utilisation des threads avec C++
    Par lolita4882 dans le forum C++
    Réponses: 4
    Dernier message: 10/11/2007, 11h25
  4. [WD9] Problème avec l'utilisation des threads
    Par ramaro dans le forum WinDev
    Réponses: 2
    Dernier message: 29/01/2007, 11h51
  5. Réponses: 4
    Dernier message: 01/03/2006, 11h35

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