Bonjour a tous

J'aimerais implementer une zone de texte dans mon appli, afin de rapporter a l'utilisateur les differentes etapes de la connexion serie.

Pour afficher les messages dans ce textview je procede ainsi:

Dans le main je declare le Widget TextView.

C'est dans le callback de mes boutons que je rempli mon TextBuffer et fait afficher son contenu dans le textview, mais le probleme c'est que l'affichage est effectif uniquement a la fermeture de ma fonction callback, alors que j'aimerais que les phrases s'affichent au fur et à mesure des etapes de connexions, je pense que vous comprendrez mieux avec 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
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
 
/* PREPARATION DU BUFFER POUR AFFICHAGE DES MESSAGES DANS LA ZONE DE TEXTE */
/* Recuperation du buffer */
    pTextBuffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(pTextView));
/* Suppression des donnees du buffer */
/*  |_ Recuperation de l'origine du buffer */
    gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
/*  |_ Recuperation de la fin du buffer */
    gtk_text_buffer_get_end_iter(pTextBuffer,&iEnd);
/*  |_ Vidage du buffer */
    gtk_text_buffer_delete(GTK_TEXT_BUFFER(pTextBuffer),&iStart,&iEnd);
 
 
/* Determine l'etat actuel du bouton */
    if(strstr(sButtonName,"_Disconnect")==NULL)
    {
/* Le bouton etait en etat "Connect" on le place en "Disconnect" => Modification
de l'apparence du bouton (Label "_DisConnect" / Item: GTK_STOCK_DISCONNECT */
        gtk_label_set_text_with_mnemonic(GTK_LABEL(pItemFromBox),"_Disconnect");
        gtk_image_set_from_stock(g_list_nth_data(glistLevel2,1),GTK_STOCK_DISCONNECT,GTK_ICON_SIZE_BUTTON);
 
/* Ouverture du Port Serie */
        SerialErr=OpenSerialPort(SerialConfig);
 
/* Affichage du message d'information sur l'ouverture du Port Serie */
        switch(SerialErr)
        {
            case _ErrorNone:
                sStatusText=g_strdup_printf("Vous avez choisi le port %s et un débit de %ld bps.\n",
                                            SerialConfig->ComPort,
                                            SerialConfig->BaudRate);
                sStatusText=g_locale_to_utf8(sStatusText,-1,NULL,NULL,NULL);
                //gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
                //gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
                gtk_text_buffer_set_text(pTextBuffer,sStatusText,-1);
                g_free(sStatusText);
 
                /* Construction de la trame de connexion au Progger */
                if(!BuildFrame("CONNECT",chBuffer,&lgFrameLength))
                {
                    sStatusText=g_strdup_printf("Trame trop longue\n");
                    sStatusText=g_locale_to_utf8(sStatusText,-1,NULL,NULL,NULL);
                    gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
                    gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
                    g_free(sStatusText);
                }
                else
                {
                    /* Envoi de la trame de connexion au Progger */
                    SerialErr=WriteCom(chBuffer,lgFrameLength);
                    if(SerialErr==_ErrorTx)
                    {
                        sStatusText=g_strdup_printf("Erreur de transmission\n");
                        sStatusText=g_locale_to_utf8(sStatusText,-1,NULL,NULL,NULL);
                        gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
                        gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
                        g_free(sStatusText);
                    }
                    else
                    {
                        SerialErr=ReadCom(chBuffer,&lgFrameLength,6);
                        if(SerialErr==_ErrorRx)
                        {
                            sStatusText=g_strdup_printf("Erreur de réception\n");
                            sStatusText=g_locale_to_utf8(sStatusText,-1,NULL,NULL,NULL);
                            gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
                            gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
                            g_free(sStatusText);
                        }
                        else if(SerialErr==_ErrorTimeout)
                        {
                            sStatusText=g_strdup_printf("Erreur de délais: Vérifier que le progger est connecté sur le bon Port, s'il est alimenté\n");
                            sStatusText=g_locale_to_utf8(sStatusText,-1,NULL,NULL,NULL);
                            gtk_text_buffer_get_end_iter(pTextBuffer,&iStart);
                            gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
                            g_free(sStatusText);
                        }
                        else
                        {
                            int i=0;
                            printf("%ld octets recus, contenu trame: ",lgFrameLength);
                            for(i=0;i<6;i++)
                                printf("<%x>",chBuffer[i]);
                            printf("\n");
 
                            /* Determination de l'etat du progger, ACK ou NAK recu? */
 
                            if(CheckCRC16CCITT((chBuffer),3))
                                if(*(chBuffer+1)==ACK)
                                {    /* Progger pret */
                                    printf("Progger pret\n");
                                }
                                else
                                {    /* Progger pas pret */
                                    printf("Progger pas pret\n");
                                }
                            else
                            {    /* Le CRC calcule ne correspond a celui envoye
                                par le progger */
                                printf("Erreur de CRC\n");
                            }
                        }
                    }
                }
                break;
 
            case _ErrorCreate:
                sStatusText=g_strdup_printf("\nPort %s indisponible (une autre ressource l'utilise).\n",SerialConfig->ComPort);
                sStatusText=g_locale_to_utf8(sStatusText,-1,NULL,NULL,NULL);
                gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
                gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
                g_free(sStatusText);
                break;
 
            case _ErrorInexistant:
                sStatusText=g_strdup_printf("\nLe port %s n'existe pas sur cette machine.\n",SerialConfig->ComPort);
                sStatusText=g_locale_to_utf8(sStatusText,-1,NULL,NULL,NULL);
                gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
                gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
                g_free(sStatusText);
                break;
 
            case _ErrorConfigPort:
                sStatusText=g_strdup_printf("\nImpossible de configurer le port %s.\n",SerialConfig->ComPort);
                sStatusText=g_locale_to_utf8(sStatusText,-1,NULL,NULL,NULL);
                gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
                gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
                g_free(sStatusText);
                break;
 
            case _ErrorTimeout:
                sStatusText=g_strdup_printf("\nImpossible de configurer les timeouts du port %s.\n",SerialConfig->ComPort);
                sStatusText=g_locale_to_utf8(sStatusText,-1,NULL,NULL,NULL);
                gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
                gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
                g_free(sStatusText);
                break;
 
            default:
                sStatusText=g_strdup_printf("\ndefault\n");
                gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
                gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
                g_free(sStatusText);
                break;
        }
    }
    else
    {
/* Le bouton etait en etat "Disconnect" on le place en "Connect" => Modification
de l'apparence du bouton (Label "_Connect" / Item: GTK_STOCK_CONNECT */
        gtk_label_set_text_with_mnemonic(GTK_LABEL(pItemFromBox),"_Connect");
        gtk_image_set_from_stock(g_list_nth_data(glistLevel2,1),GTK_STOCK_CONNECT,GTK_ICON_SIZE_BUTTON);
 
/* Fermeture du Port Serie */
        CloseSerialPort();
 
/* Affichage du message d'information sur la fermeture du Port Serie */
        sStatusText=g_strdup_printf("\nLe port %s est maintenant fermé\n",SerialConfig->ComPort);
        sStatusText=g_locale_to_utf8(sStatusText,-1,NULL,NULL,NULL);
        gtk_text_buffer_get_start_iter(pTextBuffer,&iStart);
        gtk_text_buffer_insert(pTextBuffer,&iStart,sStatusText,-1);
        g_free(sStatusText);
    }
}
J'ai essayé le mode suivant: connexion a un port qui existe, donc SerialErr=_ErrorNone ce qui me permet de rentrer dans le premier "cas" du switch.
Dans ce cas ci, je devrais voir apparaitre dans le TextView la phrase:
"Vous avez choisi le port xxx et un débit de xxx bps.", hors ce n'est pas le cas, le programme passe a la construction de la trame, qui reussi sans erreur, puis a l'envoi de la trame a la cible. La cible n'etant pas branchée, je me retrouve avec un "timeout" ==>SerialErr=_ErrorTimeout, je rajoute donc la phrase:
"Erreur de délais: Vérifier que le progger est connecté sur le bon Port, s'il est alimenté", le textview etant toujours vierge. Le switch se termine, la fonction callback se termine egalement, et c'est a cet instant que je vois s'afficher dans le TextView:

"Vous avez choisi le port xxx et un débit de xxx bps."
"Erreur de délais: Vérifier que le progger est connecté sur le bon Port, s'il est alimenté"

Comment se fait il que l'affichage soit réalisé a ce moment ci et pas au fur et a mesure du deroulement du code? Est ce que je m'y prends mal? ou est ce tout simplement pas possible?

Merci d'avance