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 :

warning d'exécution avec gtk_events_pending()


Sujet :

GTK+ avec C & C++

  1. #1
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut warning d'exécution avec gtk_events_pending()
    Slt! sur une interface, j'essaie de récupérer après chaque seconde (d'un serveur) un texte que j'affiche sur un label. L'affichage doit être dynamique: rafraichissement de l'affichage après chaque seconde

    j'ai utilisé gtk_events_pending()(pour le rafraissement instantané) dans ce bout de code:

    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
    //...
    //reponse=sock_recv_text_dyn(sock);
     
    while(strcmp(reponse,"FIN")!=0 && strcmp(reponse,"0:0")!=0){
     
    while(gtk_events_pending()){
    gtk_main_iteration();
    }
                                    gtk_label_set_text(GTK_LABEL(hm_restantes),reponse);
     
    //free(reponse),reponse=NULL;
    //reponse=sock_recv_text_dyn(sock);
    }
    //free(reponse),reponse=NULL;
     
    //..
    je signale d'abord que la fonction dans laquelle se trouve ce bout de code se trouve elle-même dans un thread.

    Mon problème est le suivant. l'utilisation de gtk_events_pending() me donne le résultat que je veux mais pendant l'exécution, j'obtiens une erreur qui m'affiche ceci:

    Glib-Warning main loop already active in another thread (g_main_context_prepare())

    Merci de bien vouloir me dire ce qui ne va pas et comment le résoudre.

    NB: quand j'enlève gtk_events_pending(), cette erreur à l'éxécution ne vient plus mais l'affichage n'est pas dynamique sous mes yeux.

    Bonne suite à tous!

  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 de thread avec Gtk+ donne souvent ce genre de problème. Je pense que tu demandes d'attendre que les évènements d'affichage de tes fenêtres soient réalisés avant de poursuivre. Le seul problème dans tout ca et que tu fais certainement cette demande dans un Thread. Et naturellement ce thread ne fait pas partie de la boucle principale de Gtk+. Donc conflit entre les deux.

    En règle générale l'utilisation des threads avec GTK+ juste pour avoir une mise à jour constante pendant de longs calculs (ou en attente de réponse réseau par exemple) n'est pas la bonne solution.

    Puisque apparemment tu fais de la communication réseau je te conseille d'aller jeter un oeil aux GIOChannel avec la couche GNET. La solution est là sans utiliser les threads.

  3. #3
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Puisque apparemment tu fais de la communication réseau je te conseille d'aller jeter un oeil aux GIOChannel avec la couche GNET. La solution est là sans utiliser les threads.
    Merci gerald3d mais je ne m'y connais pas en GIOchannels et je vais voir au niveau de la doc officielle mais avant, j'ai une faveur à te demander. Pourrais tu me faire un bout de code où les GIOchannels jouent un role qui pourrait m'aider à faire ce que je veux? un truc où je peux l'utiliser au lieu de mettre ma fonction dans un thread. Merci!

  4. #4
    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
    Si tu utilises gtk+ avec des threads, la première chose à faire est de lire très attentivement http://library.gnome.org/devel/gdk/s...k-Threads.html
    Tu peux pas t'en tirer avec des g_timeout_add ou des g_idle_add appelés dans tes threads ? Ca permet de "transférer" du code à exécuter d'un thread vers le thread principal.

  5. #5
    Membre habitué Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Si tu utilises gtk+ avec des threads, la première chose à faire est de lire très attentivement http://library.gnome.org/devel/gdk/s...k-Threads.html
    .
    Premièrement j'avais pas dit que j'utilisais les thread de la Glib. j'utilise pthread.


    Tu peux pas t'en tirer avec des g_timeout_add ou des g_idle_add appelés dans tes threads ? Ca permet de "transférer" du code à exécuter d'un thread vers le thread principal
    Ensuite j'ai pas dit non plus que j'ai utilisé ni mis g_timeout_add ou g_idle_add comme tu dis dans un thread. rien de ça! relis le post. Cordialement!

  6. #6
    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
    Citation Envoyé par doderic Voir le message
    Premièrement j'avais pas dit que j'utilisais les thread de la Glib. j'utilise pthread.
    C'est pareil, j'ai parlé d'utiliser des threads avec gtk+, pthreads ou gthreads, ça n'a pas d'importance.


    Citation Envoyé par doderic Voir le message
    Ensuite j'ai pas dit non plus que j'ai utilisé ni mis g_timeout_add ou g_idle_add comme tu dis dans un thread. rien de ça! relis le post. Cordialement!
    J'ai pas dit que tu les avais utilisés, c'était une suggestion que je te faisais qui permet d'éviter le genre de problème que tu décris et qui sont courants quand on utilise gtk+ avec plusieurs threads...

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

Discussions similaires

  1. Erreur d'exécution avec les Runtime
    Par denils dans le forum Runtime
    Réponses: 30
    Dernier message: 22/01/2015, 15h21
  2. Réponses: 6
    Dernier message: 28/11/2013, 11h55
  3. Problème d'exécution avec Dec C++
    Par PNL dans le forum C
    Réponses: 20
    Dernier message: 02/10/2005, 03h59
  4. warnings à l'exécution en mode debug
    Par garestou dans le forum MFC
    Réponses: 2
    Dernier message: 23/06/2005, 16h17
  5. Problème à l'exécution avec wxWindows (compilé avec BCC55)
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 14/11/2003, 18h04

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