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.