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

C Discussion :

XWindow et Glib


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 26
    Par défaut XWindow et Glib
    Salut,

    je suis en train de créer une application en C avec une interface graphique en XWindow. Cette application utilise les bibliothèques GStreamer afin d'afficher des vidéos et ces bibliothèques utilisent la bibliothèque Glib pour la "main loop".

    Le problème est qu'à partir du moment où la "main loop" est exécutée, je n'ai plus de contrôle sur l'interface graphique en Xwindow (elle est bloquée) car celle-ci n'utilise pas la "main loop" de Glib.

    Des recherches sur internet m'ont permis de comprendre le problème : lorsque la "main loop" est lancée, tous les événements sont redirigés vers celle-ci, empêchant la communication avec mon interface graphique et son serveur X.

    Quelqu'un aurait-il une idée pour résoudre ce bloquage engendré par la "main loop" de Glib.

    Merci.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par bouncebounce
    Quelqu'un aurait-il une idée pour résoudre ce bloquage engendré par la "main loop" de Glib.
    Oui

    2 solutions :

    • désactiver la main loop de Glib
    • désactiver la main loop de X


    Pour Glib je ne connais pas.

    Pour X :

    Rempacer la main loop par ce qui est donné dans tout bon cours de X pour les premiers programmes, soit :

    une boucle infinie avec GetEvent et DispatchEvent et PutBackEvent, dans laquelle tu peux sélectionner le type d'évènement, et traiter à part ce que tu veux...


    Mais à mon avis le mieux serait de désactiver celle de la Glib (moins d'événements).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 26
    Par défaut
    Merci pour ta réponse.

    je veux bien désactiver la main loop de Glib, mais le problème est que j'utilise GStreamer pour afficher des vidéos et que GStreamer utilise la Glib pour sa gestion des événements. En gros, si je désactive la main loop de Glib, je ne recevrais plus d'événement provenant de GStreamer.

    Il doit bien y avoir un moyen de faire cohabiter ces deux main loop. Je suis entrain de regarder une méthode. Je test et je vous en dis ce qu'il en est.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 26
    Par défaut
    Salut,

    je pense avoir trouver la solution à ce problème.

    Pour cela, il faut utilisser la fonction "g_idle_add_full" de la Glib.

    Elle permet d'appeler une fonction à chaque fois q'il n'y a pas d'événements importants en attente dans la main loop.

    voici le 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    Widget TopLevel;
    // contexte Xwindow
    XtAppContext  app_context;
     
     
    void main ()
    {
    	TopLevel = XtAppInitialize (&app_context, "Mon application", NULL, 0, &argc, argv, NULL, NULL, 0);
     
    	...
     
    	// affichage de l'interface graphique
    	XtRealizeWidget(TopLevel);
     
    	g_idle_add_full(G_PRIORITY_DEFAULT, main_loop_dispatch, NULL, NULL);
     
    	// mainloop Glib
    	g_main_loop_run(loop);
    }
     
     
     
    static gboolean main_loop_dispatch(gpointer data)
    {
    	XEvent event;
     
    //	Lit l'evenement
    	XtAppNextEvent(app_context, &event);
     
    //	Envoie l'evenement a qui de droit
    	XtDispatchEvent(&event);
    	XFlush (XtDisplay(TopLevel));
     
    	return TRUE;
    }

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

Discussions similaires

  1. [glib] parser fichier xml
    Par .:dev:. dans le forum C
    Réponses: 10
    Dernier message: 18/07/2006, 00h00
  2. [GLib] malloc
    Par lechewal dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 29/04/2006, 11h09
  3. [Glib] listes chainées
    Par lechewal dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 26/04/2006, 15h49
  4. Impossible de compiler un projet avec #include <glib.h>
    Par canard75 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 14/12/2005, 18h18
  5. Sélection avec XWindow ?
    Par doudblast dans le forum Linux
    Réponses: 2
    Dernier message: 25/05/2005, 12h23

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