UpdateWindow et SendMessage (HEEEEEEELP!!!!!)

Résolu
scelw Messages postés 117 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 17 février 2007 - 11 déc. 2004 à 11:49
 magic_Nono - 13 déc. 2004 à 08:44
Bonjour,

Mon prog fonctionne grâce à une boucle principale, chargée d'effectuer de longs calculs. Je souhaite afficher, au fur et à mesure de l'avancement de ces calculs, des résultats intermédiaires. Mais le problème est que ma fenêtre ms-dos n'affiche rien tant que la boucle n'a pas complétement fini de tourner. Je voudrais donc trouver un moyen d'actualiser ma fenêtre ms-dos PENDANT que ma boucle tourne.
Ma question :
Comment utilise-t-on UpdateWindow() et SendMessage() pour mettre à jour, "de force", une fenêtre ms-dos?

-

PS : Je suis sous Visual Studio 6. Et j'ai déjà essayé d'utiliser, à l'intérieur de ma boucle, des fonctions similaires au DoEvents en VB (avec PeekMessage) ou de mettre des Sleep(100) mais rien n'y fait... HEEEELP !

21 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
11 déc. 2004 à 22:56
On peut faire aussi:
cout << "Bienvenue : \n"<< flush;

C'est plus pratique.
Je viens de découvrir ce truc car j'ai pas l'habitude de travailler avec "cout", j'ai toujours utilisé "printf".
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2004 à 12:41
Si tu n'as mis aucun printf avant la fin de la boucle ca ne va rien afficher. Il faudrait voir un peu de code pour comprendre, parce que normalement ca s'affiche aussitot, même pendant une boucle
0
scelw Messages postés 117 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 17 février 2007
11 déc. 2004 à 12:47
tout d'abord, merci vecchio56 d'avoir bien voulu répondre à ma demande d'aide...

je n'utilise pas de printf mais des : cout << "texte_à_afficher";

Pour le bout de code, je vais essayer d'en copier/coller un cet après-midi...

-
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2004 à 12:52
Les messages s'affichent au fur et a mesure:

#include <windows.h>
#include 

using namespace std;

int main()
{
int i = 20;
while(i)
{
cout << "texte_à_afficher";
i--;
Sleep(100);
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
scelw Messages postés 117 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 17 février 2007
11 déc. 2004 à 15:23
bout de code qui ne marche pas (enfin... le txt ne s'affiche pas avant la fin de la boucle, quoi...)

------------------------

#include <NTL/ZZ.h>
#include <fstream.h>
#include
#include <stdio.h>
#include <time.h>
#include <windows.h>

int main()
{
int i, tour, x;
tour = 20;

cout << "Bienvenue : \n";
Sleep(1000);
do {
i = 0;
x = 162;
do {
x = x * (1037 + x) + 11;
i++;
} while (i <= 5);

cout << tour;
cout << " : ";
cout << " \n";

Sleep(1000);
tour = tour + 1;
} while (tour <= 30);
Sleep(1000);
cout << "c'est bon, programme terminé!";
Sleep(9000);
return 0;
}

------------------------
help...
-
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2004 à 15:41
Moi il affiche bien, je comprends pas pourquoi chez toi ca marche pas
0
scelw Messages postés 117 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 17 février 2007
11 déc. 2004 à 19:57
ah ouais?????? chez toi, ça marche bien correctement (affichage du numero de tour, de 20 à 30, avant la fin des calculs) ???!!!!!
ça fout la mort si c'est mon système qui bug!!!!

d'où ça peut venir?? c'est dingue! re-HELPPP!!!!
-
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
11 déc. 2004 à 21:20
Salut,
Chez moi, le même problème: pas d'affichage avant la fin de la boucle. C'est bizarre, je vais essayer de comprendre pourquoi.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2004 à 21:27
Ca alors.. Vous avez quel compilateur?
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
11 déc. 2004 à 21:58
J'ai Visual C++ 6. Après des tests, j'ai remarqué que l'affichage ne se fait qu'après le dernier "cout" même sans boucle. Exemple:
int main()
{
cout << "Bienvenue : \n";
Sleep(5000);//pareil avec system("PAUSE")
cout << "Fin de programme : \n";
return 0;
}

Dans cet exemple, l'affichage des deux messages se fait à la fois après écoulement des 5 secondes. Je ne comprends pas pourquoi car je ne connais pas les détails de fonctionnement de "cout".

Par contre, avec "printf", ça marche nickel:
int main()
{
int i, tour, x;
tour = 20;
printf("Bienvenue : \n");
Sleep(1000);
do {
i = 0;
x = 162;
do {
x = x * (1037 + x) + 11;
i++;
} while (i <= 5);
printf("%d :\n",tour);
Sleep(1000);
tour = tour + 1;
} while (tour <= 30);
Sleep(1000);
printf("c'est bon, programme terminé!\n");
Sleep(9000);
return 0;
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2004 à 22:17
C'est bizarre que personne n'ait jamais signalé ce problème...
En tous cas sous vs.net 7.1 c'est réglé
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
11 déc. 2004 à 22:44
Je viens de comprendre que "cout" est bufferisée. Ce buffer est affiché en une seule fois. Pour forcer l'affichage d'un message, il faut faire suivre "cout" de "cout.flush()" et le problème est réglé. Peut-être que c'est fait par défaut sous .NET.
Le code original fonctionne parfaitement après ajout de "cout.flush()":
int main()
{
int i, tour, x;
tour = 20;
cout << "Bienvenue : \n";
cout.flush();//forcer affichage
Sleep(1000);
do {
i = 0;
x = 162;
do {
x = x * (1037 + x) + 11;
i++;
} while (i <= 5);
cout << tour;
cout << " : ";
cout << " \n";
cout.flush();//forcer affichage
Sleep(1000);
tour = tour + 1;
} while (tour <= 30);
Sleep(1000);
cout << "c'est bon, programme terminé!";
cout.flush();//forcer affichage
Sleep(9000);
return 0;
}

Je vais essayer de déterminer le ou les fichiers à mettre à jour dans VC6 afin qu'il se comporte comme VC.net pour ce genre de cas.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2004 à 22:49
Tu as le SP6 au moins?
J'avoue quand meme que ca m'étonne, à l'époque ou j'avais VC6 SP5 j'ai jamais remarqué de truc de ce genre, et je trouve pas ca très paratique de devoir vider le tampon comme ca.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
11 déc. 2004 à 23:05
Voilà surement la meilleure solution:
cout << "Bienvenue :"<< endl;

Je pense qu'on n'a plus besoin de mettre à jour notre VC6 puisque ce simple "<<endl" résoud le problème... :)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2004 à 23:09
Ah oui? J'ai failli le dire car il me semblait bien que \n et endl n'étaient pas vraiments équivalents, c'est bon a savoir
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
11 déc. 2004 à 23:46
Moi je pensais qu'ils étaient équivalents.
A propos du SP de mon VC6, je n'ai jamais installé de SP car je n'ai pas encore rencontré de véritable problème qui pourrait justifier cette installation. Je respecte le principe qui dit: "Tant que ça marche bien, il ne faut rien changer." :)
Cependant, je télécharge les dernières versions de la plateforme SDK afin d'y puiser les dernières mises à jour des fichiers .h et .lib pour les utiliser en cas de besoin.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 déc. 2004 à 00:03
"je n'ai pas encore rencontré de véritable problème qui pourrait justifier cette installation"
Si maintenant c'est fait, c'est un véritable problème que tu as rencontré.
Installe le SP5 ca marchera toujours (le 6 je sais pas, mais ya des chances que oui quand même)
0
scelw Messages postés 117 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 17 février 2007
12 déc. 2004 à 00:19
Merci à vous, je crois que vous avez mis le doigt sur le fond de mon problème (que je tente vainement de résoudre depuis plusieurs mois) !
Je vais tester les flush demain! je vous tiens au courant pour savoir si ça marche.

en attendant, j'ai trouvé un pti tutorial où la différence est faite en flush et endl : http://www.exood4.com/tutorials/articles/C++/C++_language_02_1.php?lang=fr

thanks a lot à vous tous pour avoir mis autant de coeur dans un problème tout de même assez pointu (et apparemment nouveau)!
-
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
12 déc. 2004 à 01:41
vecchio56 > Ce n'est pas un véritable problème pour moi car je ne programme presque plus en mode console et je n'utilise pratiquement jamais "cout". Je vais essayer de trouver la liste des améliorations que pourrait apporter le SP6. Si c'est au niveau du confort d'utilisation de VC6, c'est sûr que je l'installerai.
0
scelw Messages postés 117 Date d'inscription mercredi 3 septembre 2003 Statut Membre Dernière intervention 17 février 2007
12 déc. 2004 à 09:30
ça maaarche !!!! VICTOIRE ! ouééééééé !
génial, génial, génial! MERCI à vous, racpp et vecchio56, pour vos échanges qui m'ont permis (moi, spectateur) de résoudre enfin un très vieux problème!!! Merci mille fois à vous deux! :)
0
Rejoignez-nous