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 :

Plantage seulement au bout d'env 30 min!


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut Plantage seulement au bout d'env 30 min!
    Bonjour,

    Je n'arrive pas à débugger mon code qui tourne très bien, mais qui plante au bout de 30-35 minutes seulement.

    C'est une appli de type "chronomètre", mais j'ai besoin en fait de rafraichir l'affichage en continu. Un g_timeout_add_seconds() ne me va donc pas. L'idée du chronomètre n'est qu'un exercice pour me faire la main.

    Le code que j'ai est à peu près le suivant:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <strings.h>
     
    int flag_depart=1;
    char format_sortie[50];
    typedef struct
    {
        GtkWidget *widget1;
        GTimer *widget2;
    } MyStruct; /* une structure pour passer plusieurs argument à un callback */
     
    int main(int argc, char **argv)
    {
        /* déclaration des widgets */
        [...]
        GtkWidget *pLabel; /* un label */
        GTimer *timer; /* un chronomètre */
        gchar* sUtf8;  /* pour formater des chaines de characteres */
        [...]
        MyStruct struct_tempo; /* une struct pour passer plusieurs arguments à une fonction callback */
        [...]
        gboolean OnExpose(GtkWidget *pWidget, GdkEvent *event, gpointer pData); /* fonction call back expose-event */
        [...]
        /* création du label */
        pLabel=gtk_label_new(NULL);
        (void)sprintf(format_sortie, "<span font_desc=\"25\"><b>00 : 00 : 00</b></span>");
        sUtf8 = g_locale_to_utf8(format_sortie, -1, NULL, NULL, NULL);
        gtk_label_set_markup(GTK_LABEL(pLabel), sUtf8);
        g_free(sUtf8);
        /* on verse le label dans la struct */
        struct_tempo.widget1=pLabel;
     
        /* création du timer */
        timer=g_timer_new();
        /* on verse le time dans la struct */
        struct_tempo.widget2=timer;
     
        /* Connexion des signaux */
        g_signal_connect(G_OBJECT(pWindow), "expose-event", G_CALLBACK(OnExpose), (gpointer )&struct_tempo);
     
    [...]
     
        return EXIT_SUCCESS;
    }
    gboolean OnExpose(GtkWidget *pWidget, GdkEvent *event, gpointer pData)
    {
        /* Mise a jour du label */
        char tempo[1000],h[3],m[3],s[3];
        int heures=0, minutes=0;
        GTimeSpan secondes=0;
        gchar* sUtf8;
        MyStruct *struct_tempo2;
        struct_tempo2= (MyStruct *)pData;
        float convertir(GTimeSpan *secondes, int *minutes, int *heures);
        if (flag_depart)
        {
            secondes=(GTimeSpan)g_timer_elapsed(struct_tempo2->widget2, NULL);
            convertir(&secondes, &minutes, &heures);
            if (secondes>9)
                (void)sprintf(s, "%d",secondes);
            else
                (void)sprintf(s, "0%d",secondes);
            if (minutes>9)
                (void)sprintf(m, "%d",minutes);
            else
                (void)sprintf(m, "0%d",minutes);
            if (heures>9)
                (void)sprintf(h, "%d",heures);
            else
                (void)sprintf(h, "0%d",heures);
            (void)sprintf(tempo, "<span font_desc=\"25\"><b>%s : %s : %s</b></span>",h, m, s);
            sUtf8 = g_locale_to_utf8(tempo, -1, NULL, NULL, NULL);
            gtk_label_set_markup(GTK_LABEL(struct_tempo2->widget1), tempo);
        }
        g_free(sUtf8);
        return FALSE;
    }
    float convertir(GTimeSpan *secondes, int *minutes, int * heures)
    {
        /* converti des secondes en heures, minutes et secondes */
        while (*secondes>59)
            {
                *minutes=*minutes+1;
                *secondes=*secondes-60;
            }
            while (*minutes>59)
            {
                *heures=*heures+1;
                *minutes=*minutes-60;
            }
    }
    Ce code marche donc très bien, mais au bout d'un temps qui est d'environ 30-35 minutes, il plante (Windows me dit - car je code ca sous Windows - "le programme à cessé de fonctionner .."). J'ai beau chercher dans tout les sens, je n'arrive pas à trouver pourquoi. Quelqu'un aurait-il un embryon d'idée pour me sortir de ce "cul-de-sac"?

    D'avance merci pour toute aide,

    Eric.

  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
    De mémoire, il me semble t'avoir déjà indiqué que g_timeout_add t'offre la granularité que tu recherches, si ce n'est pas les cas de g_timeout_add_seconds.

    Pour savoir où ça plante, le mieux est de compiler avec les informations de debug et lancer le tout dans un débogueur, il t'indiquera à quelle ligne tu crashes, et l'état de la pile (backtrace).

Discussions similaires

  1. [PPT-2007] Etiquettes : valeur min et max d'un graph seulement
    Par Invité dans le forum Powerpoint
    Réponses: 0
    Dernier message: 08/10/2009, 10h23
  2. Plantage au bout d'un moment
    Par Thixomag dans le forum Général Java
    Réponses: 29
    Dernier message: 03/05/2009, 23h21
  3. Réponses: 3
    Dernier message: 07/07/2008, 16h34
  4. plantage au bout de 2 boucles
    Par lecknaat dans le forum VB.NET
    Réponses: 3
    Dernier message: 09/06/2007, 14h54
  5. Réponses: 7
    Dernier message: 01/03/2007, 20h54

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