mon programme est destiné au calcul scientifique. il calcule donc à tour de bras sans relâche, les opérations pouvant durer des heures voire des jours puisqu'il s'agit de très grands nombres (gérés avec une classe spéciale mais peu importe). mon problème est que le programme utilise toutes les ressources du système pour calculer et, par exemple, ne permet pas aux résultats intermédiaires de s'afficher. j'aimerais trouver une fonction pour redonner temporairement la main au système (genre DoEvents en VB) sachant que j'utilise Visual Studio 6...
bon, j'ai la solution. il suffit de "flusher" la mémoire, c'est à dire de la forcer à s'écrire. ex :
cout << "texte_à_afficher" << flush;
et voilà! c du à une erreur dans certaines versions de Visual Studio 6 apparemment... (voir mon sujet intitulé "UpdateWindow et SendMessage" sur cppfrance.)
Ah et j'ai oublié, si tu utilises des threads, fo gérer ca avec les objets de synchronisation, dans l'appel a WaitFor(Single/Multiple)Object(). Details sur MSDN.
Si tu fais du calcul scientifique intensivement, faut te mettre à UNIX d'urgence !!!
un systeme UNIX te permettra de donner une priorité (basse) à un processus, de façon à ne pas bouffer toutes les ressources.
utiliser Sleep pour "scheduler" ? ça me fait de la peine ... C'est pas une solution.
Euh plus_plus_fab, faudrait te renseigner sur les API Windows avant de dire des betises...Un systeme Windows te permet de donner une priorité basse aussi, SetThreadPriority()...
Et cette idée est completement debile, ton thread ne sera pas prioritaire, et pour du calcul INTENSIF, excuse moi mais c pas top..
Personnelement, je trouve le Sleep() bien, et ne vois pas pkoi ca te fait tant de peine...
je n'ai pas l'intention de me renseigner sur les API w$.
je n'ai pas dit de betises.
utiliser Sleep, c'est débile.
Ce SetThreadPriority(), il peut donner une priorité basse à un processus ?
m'étonnerais !
Sur UNIX, il y a la commande nice qui permet de lancer un processus avec une priorité basse, et renice d'affecter une priorité basse à un processus déja lancé.
C'est l'idéal pour faire des grosses taches de fond ... et pouvoir travailler sans gros ralentissements.
scelw > je te dit ça parce que vraiment, c'est la solution à ton problème. Mais peut-etre n'as tu pas le choix de la plateforme de développement, ou autre, je respecte ...
Ok comme tu avais fait un multi post j'avais repondu ailleurs
Plus bas la reponse originelle ... Mais le truc de Matt67
doit fonctionner
A+
-------------------------------
Si ton appli est multi-thread, ca devrait fonctionner sans
problème (voir peut etre a ajouter un sleep(..) histoire de
redonner un peu de temps au système)..
Si ce n'est pas le cas, la gestion de la boucle des message n'est
jamais appelée (donc pas de gestion du WM_PAINT -> pas
de mise à jour de la fenêtre).. puisque tu ne rends pas la main
a ton process...
Dans ce cas je crois qu'il faut appeler UpdateWindow(hwnd),
ou alors faire un SendMessage(hwnd, WM_PAINT) qui à la
différence du PostMessage ne rend la main qu'une fois la
fonction executée...
Mes souvenirs dans ce domaine sont un peu vieux ... si qqun
pouvais confirmer...
Oupss à une différence près peut etre :
Matt67 si je me trompe pas tu as récupéré une procédure
winmain standard ... mais il me semble qu'on ne sortira de la
fonction à cause du while que dans le cas du message WM_QUIT.
Le while serait donc a supprimer dans la fonction ????
en fait, tu veux donner la main au systeme pour quoi faire ? pour que les résultats intermédiaires puissent s'afficher ? ça n'a rien à voir, regarde plutot du coté de la vidange de tes flux d'entrée sortie (flush).
Si c'est pour moins encombré ton système, Brunews t'as donné la réponse, lance ton processus de calcul à l'aide de ProcessCreate, en indiquant une priorité basse.
oui je veux juste donner la main au système pour l'affichage des résultats intermédiaires (cad affichage dans fenêtre ms-dos + création d'un fichier txt contenant des données). la machine sera dédiée à ce travail donc il ne s'agit pas de baisser la priorité du processus (du programme).
merci pour vos aides, je teste tout ça ce WE et je vous tiens au courant. merci pour tout!! :)
Ce qui serait idéal c'est une fonction comme celle de Matt67, pour traiter les messages en attente... Mais je n'arrive pas à faire marcher ce code!!! Comment ça se fait??
Est-ce qu'il faut rajouter des includes ou des composants particuliers pour que le code marche?
(je rappelle que je travaille avec Visual Studio 6...)
J'aimerais tant arriver à faire marcher cette fonction!!!!
Tenez, voici les erreurs que me renvoient le débuggeur quand j'essaye de compiler mon prog : (toutes les erreurs sont dues à la fonction DoEvents() de Matt67. Sans elle mon prog n'affiche pas d'erreur, seulement deux "warning"...)
--------------------Configuration: first gen - Win32 Debug--------------------
Compiling...
first gen source.cpp
C:\Program Files\Microsoft Visual Studio\Myprojects\first gen\first gen source.cpp(10) : error C2065: 'MSG' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\Myprojects\first gen\first gen source.cpp(10) : error C2146: syntax error : missing ';' before identifier 'msg'
C:\Program Files\Microsoft Visual Studio\Myprojects\first gen\first gen source.cpp(10) : error C2065: 'msg' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\Myprojects\first gen\first gen source.cpp(11) : error C2065: 'PeekMessage' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\Myprojects\first gen\first gen source.cpp(11) : error C2065: 'PM_REMOVE' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\Myprojects\first gen\first gen source.cpp(13) : error C2065: 'TranslateMessage' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\Myprojects\first gen\first gen source.cpp(14) : error C2065: 'DispatchMessage' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\Myprojects\first gen\first gen source.cpp(23) : warning C4551: function call missing argument list
C:\Program Files\Microsoft Visual Studio\Myprojects\first gen\first gen source.cpp(30) : warning C4551: function call missing argument list
Saperlipopette, c'est exactement ce qui posait problème!
A présent tout baigne, j'avais simplement ommis d'inclure windows.h...
AlexMAN, je te consacre "Aideur d'or"!
Merci aussi à Matt67 pour son code (qui fonctionne très bien maintenant) et à tous les autres, pour leur contributions diverses!