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+] Log et g_io_add_watch


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut [GTK+] Log et g_io_add_watch
    Bonjour,
    Je cherche aujourd'hui à faire un fichier de log.
    Le but du jeu est que mes lib puissent renvoyer leurs messages d'erreurs vers un fichier et que mon appli principale affiche ce fichier dans une text area.

    Voilà ce que j'ai fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	GIOChannel *pFichierLog;
    	GError *pErr = NULL;
    	pFichierLog = g_io_channel_new_file("./IHM/test","r",&pErr);
    	g_io_add_watch(pFichierLog,G_IO_IN,FonctionUpdateLog,NULL);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // LOG
    gboolean FonctionUpdateLog(GIOChannel *gio,GIOCondition condition, gpointer data)
    {
    	gchar * msg;
    	GError *pErr = NULL;
    	gsize len;
    	g_io_channel_read_line(gio, &msg, &len, NULL, &pErr);
    	printf("log?");
    }
    Je voulais donc que la fonction FonctionUpdateLog ne soit appelée qu'en cas de changement sur le fichier /IHM/test mais là elle est appeler tout le temps même quand /IHM/test est vide!
    J'ai mal compris la fonction je pense.
    Vous connaissez une autre façon de faire?
    Si je met un update de ma textArea à la place de mon printf("log?") ça rafraichira ma fenêtre mais ça va spammer comme pas possible, niveau performance ça craint...
    Merci!

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    A quel moment exactement est-ce que ta fonction de log est appelée au juste ? Et qu'est ce qu'elle lit ? Je te conseille d'améliorer tes traces en rajoutant dans ton printf les données qui ont été lues, pour voir ce qui se passe. Et si tu écris avec une autre application dans ce fichier à ce moment là, est-ce que le résultat dans ton appli est correct ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Bonjour!
    Merci de ta réponse.
    En faite quand je lance mon appli dans la console j'ai des log?log?log?log?log?log?log?log?log?log?log?log?log?
    Donc ma fonction à l'air appelé tous le temps...
    Elle lit le fichier de log qui est vide actuellement

    Et l'application ne charge plus le reste de l'interface graphique.
    Pour le moment rien ne modifie le fichier en question et il est vide au départ ^^

    Une idée?

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Bon, alors tout d'abord, c'est plus facile d'avoir une idée quand on vérifie les codes de retour... Tu ne le fais pas et c'est une très mauvaise habitude.
    Voici un exemple autonome qui reproduit le problème, avec des traces...

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    gboolean
    FonctionUpdateLog (GIOChannel *source,
                    GIOCondition condition,
                    gpointer data)
    {
            gchar * msg;
            GError *pErr = NULL;
            gsize len;
            GIOStatus status;
     
            g_assert (condition == G_IO_IN);
            status = g_io_channel_read_line (source, &msg, &len, NULL, &pErr);
            switch (status)
            {
                    case G_IO_STATUS_NORMAL:
                            g_debug ("Data read = '%s'", msg);
                            g_free (msg);
                            break;
     
                    case G_IO_STATUS_ERROR:
                            g_assert (pErr != NULL);
                            g_error ("%s", pErr->message);
                            break;
     
                    case G_IO_STATUS_EOF:
                            g_debug ("End of file detected");
                            break;
     
                    case G_IO_STATUS_AGAIN:
                            g_debug ("Resource is busy, we'll try again");
                            break;
     
                    default:
                            g_assert_not_reached ();
            }
     
            return TRUE;
    }
     
     
    int main (int argc,  char**argv)
    {
            GMainLoop *loop;
            GIOChannel *pFichierLog;
            GError *pErr = NULL;
            pFichierLog = g_io_channel_new_file("./testfile","r",&pErr);
            g_io_add_watch (pFichierLog, G_IO_IN, FonctionUpdateLog, NULL);
            loop = g_main_loop_new (NULL, FALSE);
            g_main_loop_run (loop);
    }
    Au vu des traces, on dirait que l'IOChannel fait du polling sur le descripteur de fichiers, et ta callback est appelée sans cesse parce que la condition "données à lire" (G_IO_IN) est remplie. Même si ce n'est que pour te rendre compte que tu es à la fin du fichier (G_IO_STATUS_EOF)...

    Donc ont dit sans cesse "y a des données à lire" et quand tu vas voir on te dit "ah bah non, t'es à la fin du fichier". J'aurais pensé comme toi avant de faire le test, que tu n'aurais été averti qu'en cas de réception de données réelles...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Bonjour,
    Un grand merci pour ta réponse,
    j'ai un poil modifier ton code pour y glisser le mien (en mode un peu violent je le reconnais)

    Voici le main
    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
     
    				/* Recuperation du buffer */
    				gchar *sBuffer;
    				GtkTextBuffer *pTextBuffer;
    				GtkTextIter iStart, iEnd;
    				g_file_get_contents("./IHM/test", &sBuffer, NULL, NULL);
    				pTextBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(TabPrinter->pTextViewLog));
    				/* Suppression des données du buffer */
    				gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
    				gtk_text_buffer_get_end_iter(pTextBuffer, &iEnd);
    				gtk_text_buffer_delete(pTextBuffer, &iStart, &iEnd);
    				/* Affichage du fichier */
    				gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
    				gtk_text_buffer_insert(pTextBuffer, &iStart, sBuffer, -1);
    				g_free(sBuffer);
     
    [...]	
     
    	GIOChannel *pFichierLog;
    	GError *pErr = NULL;
    	pFichierLog = g_io_channel_new_file("./IHM/test","r",&pErr);
            g_io_add_watch (pFichierLog, G_IO_IN, FonctionUpdateLog, (gpointer*) TabPrinter);
     
    	if(pErr)
    		g_print("Erreur = %s\n",pErr->message);
     
    	gtk_main();
    Et la fonction de log:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    // LOG
    gboolean FonctionUpdateLog(GIOChannel *source,GIOCondition condition, gpointer data)
    {
            gchar * msg;
            GError *pErr = NULL;
            gsize len;
            GIOStatus status;
    	gchar * sBuffer;
    	GtkTextIter iStart, iEnd;
    	GtkTextBuffer *pTextBuffer;
    	Window_Printer *TabPrinter;
    	TabPrinter = (Window_Printer *) data;
     
            g_assert (condition == G_IO_IN);
            status = g_io_channel_read_line (source, &msg, &len, NULL, &pErr);
            switch (status)
            {
                    case G_IO_STATUS_NORMAL:
    				/* Recuperation du buffer */
    				g_file_get_contents("./IHM/test", &sBuffer, NULL, NULL);
    				pTextBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(TabPrinter->pTextViewLog));
    				/* Suppression des données du buffer */
    				gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
    				gtk_text_buffer_get_end_iter(pTextBuffer, &iEnd);
    				gtk_text_buffer_delete(pTextBuffer, &iStart, &iEnd);
    				/* Affichage du fichier */
    				gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
    				gtk_text_buffer_insert(pTextBuffer, &iStart, sBuffer, -1);
    				g_free(sBuffer);
                            g_debug ("data Read = '%s'", msg);
                            g_free (msg);
                            break;
     
                    case G_IO_STATUS_ERROR:
                            g_assert (pErr != NULL);
                            g_error ("%s", pErr->message);
                            break;
     
                    case G_IO_STATUS_EOF:
                            g_debug ("End of file detected");
                            break;
     
                    case G_IO_STATUS_AGAIN:
                            g_debug ("iResource is busy, we'll try again");
                            break;
     
                    default:
                            g_assert_not_reached ();
            }
    }
    Le soucis c'est qu'au début il actualise ma fenêtre de log une fois (normal) après il passe dans la fonction FonctionUpdateLog
    J'ai le droit à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DEBUG: data  Read = "Salut liberforce!"
    DEBUG: End of file detected
    Puis si je change le fichier à la main, il ne se passe rien, il n'update plus.
    J'ai l'impression qu'il exécute une fois FonctionUpdateLog et qu'il ne le fait plus après...
    Est ce que tu sais pourquoi?

    Encore merci pour ton aide et ton temps!

  6. #6
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Déjà je me demande comment ça peut compiler... A chaque fois que tu me donnes un exemple, ta callback qui est censée renvoyer un gboolean ne renvoie rien...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Voilà une petite modif que propose un de mes collègues (en rouge)


    Et la fonction de log:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    // LOG
    gboolean FonctionUpdateLog(GIOChannel *source,GIOCondition condition, gpointer data)
    {
            gchar * msg;
            GError *pErr = NULL;
            gsize len;
            GIOStatus status;
    	gchar * sBuffer;
    	GtkTextIter iStart, iEnd;
    	GtkTextBuffer *pTextBuffer;
    	Window_Printer *TabPrinter;
    	TabPrinter = (Window_Printer *) data;
     
    	while(gtk_events_pending())
    		gtk_main_iteration();
    
            g_assert (condition == G_IO_IN);
            status = g_io_channel_read_line (source, &msg, &len, NULL, &pErr);
            switch (status)
            {
                    case G_IO_STATUS_NORMAL:
    				/* Recuperation du buffer */
    				g_file_get_contents("./IHM/test", &sBuffer, NULL, NULL);
    				pTextBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(TabPrinter->pTextViewLog));
    				/* Suppression des données du buffer */
    				gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
    				gtk_text_buffer_get_end_iter(pTextBuffer, &iEnd);
    				gtk_text_buffer_delete(pTextBuffer, &iStart, &iEnd);
    				/* Affichage du fichier */
    				gtk_text_buffer_get_start_iter(pTextBuffer, &iStart);
    				gtk_text_buffer_insert(pTextBuffer, &iStart, sBuffer, -1);
    				g_free(sBuffer);
                            g_debug ("data Read = '%s'", msg);
                            g_free (msg);
                            break;
     
                    case G_IO_STATUS_ERROR:
                            g_assert (pErr != NULL);
                            g_error ("%s", pErr->message);
                            break;
     
                    case G_IO_STATUS_EOF:
                            g_debug ("End of file detected");
                            break;
     
                    case G_IO_STATUS_AGAIN:
                            g_debug ("iResource is busy, we'll try again");
                            break;
     
                    default:
                            g_assert_not_reached ();
            }
    	Return TRUE;
    }
    Ca ne bloque plus l'affichage, et ça fait bien ce que je demande, maintenant la présence d'un while est peut être pas top mais ça marche...
    T'en penses quoi?

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

Discussions similaires

  1. Fichiers de Log
    Par Mouse dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/05/2003, 18h06
  2. [GTK]instal devPack avec dev c++
    Par FreshVic dans le forum Autres éditeurs
    Réponses: 8
    Dernier message: 15/04/2003, 16h48
  3. [Kylix] Kylix GTK et QT
    Par mailstef dans le forum EDI
    Réponses: 2
    Dernier message: 19/11/2002, 21h53
  4. [GTK]PB Librairie GTK+ sous dev-c++
    Par wozzy dans le forum Dev-C++
    Réponses: 15
    Dernier message: 05/11/2002, 14h55
  5. [] [Stratégie] Comment créer un fichier log
    Par Skeezo dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 16/09/2002, 18h30

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