UpdateWindow et SendMessage (HEEEEEEELP!!!!!) [Résolu]

Signaler
Messages postés
117
Date d'inscription
mercredi 3 septembre 2003
Statut
Membre
Dernière intervention
17 février 2007
-
 magic_Nono -
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

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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".
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
117
Date d'inscription
mercredi 3 septembre 2003
Statut
Membre
Dernière intervention
17 février 2007

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...

-
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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);
}
}
Messages postés
117
Date d'inscription
mercredi 3 septembre 2003
Statut
Membre
Dernière intervention
17 février 2007

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...
-
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Moi il affiche bien, je comprends pas pourquoi chez toi ca marche pas
Messages postés
117
Date d'inscription
mercredi 3 septembre 2003
Statut
Membre
Dernière intervention
17 février 2007

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!!!!
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ca alors.. Vous avez quel compilateur?
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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;
}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est bizarre que personne n'ait jamais signalé ce problème...
En tous cas sous vs.net 7.1 c'est réglé
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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... :)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
"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)
Messages postés
117
Date d'inscription
mercredi 3 septembre 2003
Statut
Membre
Dernière intervention
17 février 2007

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)!
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
117
Date d'inscription
mercredi 3 septembre 2003
Statut
Membre
Dernière intervention
17 février 2007

ç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! :)