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 :

Pb avec g_idle_add


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 65
    Points : 53
    Points
    53
    Par défaut Pb avec g_idle_add
    Salut,
    selon vous comment appeler la fonction pcap_loop avec g_idle_add ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pcap_loop(handle, -1, got_packet, (u_char *) dumpdesc);
    Si je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_idle_add(pcap_loop,NULL);
    Comment je fait pour passer les paramètres à la fonction callback ?

  2. #2
    Membre habitué

    Inscrit en
    Mai 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 132
    Points : 171
    Points
    171
    Par défaut
    Salut,

    definition pour la function appelee de g_idle_add est:

    gboolean func ( gpointer user_data );

    Donc il y a une possibilite .... passer une struct.

    typedef struct {
    ......
    } MY_STRUCT;

    MY_STRUCT my_struct;
    g_idle_add ( pcap_loop, &my_struct );

    Et dans callback function

    gboolean pcap_loop ( gpointer user_data )
    {
    MY_STRUCT *my_struct = (MY_STRUCT*)user_data;
    ......
    }

    Est-ce que c'est claire ?

    Fredy

  3. #3
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 65
    Points : 53
    Points
    53
    Par défaut Est ce que c'est possible ?!
    Merci pour votre réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pcap_loop(handle, -1, got_packet, (u_char *) dumpdesc);
    C'est un appel à une fonction déja connu (prédéfini) par la librairie de capture "libpcap"..

    typedef struct {
    ......
    } MY_STRUCT;

    MY_STRUCT my_struct;
    g_idle_add ( pcap_loop, &my_struct );

    Et dans callback function

    gboolean pcap_loop ( gpointer user_data )
    {
    MY_STRUCT *my_struct = (MY_STRUCT*)user_data;
    ......
    }
    D'après vous, je dois redéfinir la fonction pcap_loop ?

  4. #4
    Membre habitué

    Inscrit en
    Mai 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 132
    Points : 171
    Points
    171
    Par défaut
    Aaaa .... je vois ....


    typedef struct {
    ... handle
    ... got_packet
    ........
    } MY_STRUCT;

    MY_STRUCT my_struct;
    g_idle_add ( my_idle_func, &my_struct );

    Et dans callback function

    gboolean my_idle_func ( gpointer user_data )
    {
    MY_STRUCT *my_struct = (MY_STRUCT*)user_data;
    ......
    pcap_loop ( my_struct->handle, -1, my_struct->got_packet, (u_char *) my_struct->dumpdesc);
    ......
    }

    Bonne journee et bon courage. Fredy

  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
    pcap_loop bloque quand on lui passe -1 en argument, il ne faut jamais appeler de fonction bloquante depuis un callback gtk+ sinon ça bloque aussi tout le rafraichissement de l'interface.

  6. #6
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 65
    Points : 53
    Points
    53
    Par défaut Merci
    pcap_loop bloque quand on lui passe -1 en argument, il ne faut jamais appeler de fonction bloquante depuis un callback gtk+ sinon ça bloque aussi tout le rafraichissement de l'interface.
    Le deuxième argument de pcap_loop c'est le nombre de paquets à capturer, le -1 c'est exprès, tant qu'il y a des paquets, traiter les dans got_packet ...

    Le problème en gros c'est comment appeler pcap_loop lorsque gtk_main() affiche l'interface en rafraîchissant l'interface ?!

    Donc si je peut pas passer la valeur -1 comme nombre de paquets à capturer, y aurais il une autre solution pour lancer deux boucle infinies simultanément?

  7. #7
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 65
    Points : 53
    Points
    53
    Par défaut Explication
    Voici en quelque sorte à quoi ressemble mon code:

    Une fonction " OnDemarrerClic () " lorsque l'utilisateur clique sur le menu Demarrer, cette fonction fait un appel à la fonction " OnDemarrer () " qui doit lancer la fonction callback parallèlement avec " gtk_main ()".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void OnDemarrerClic()
    {
        g_idle_add(OnDemarrer,NULL);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    gboolean OnDemarrer(gpointer data)
    {               ...
       char errbuf[PCAP_ERRBUF_SIZE];
                    ...
                    ...
        pcap_loop(handle, 5000, got_packet, (u_char *) dumpdesc);
    return FALSE;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main( int argc, char *argv[])
    {                ...
                     ...
       while (gtk_events_pending ())
       gtk_main_iteration ();
     
       gtk_main();
     
       return 0;
    }

Discussions similaires

  1. requete avec OBCD et visual c++
    Par Anonymous dans le forum MFC
    Réponses: 12
    Dernier message: 18/11/2004, 16h15
  2. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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