Help : redonner la main au système [Résolu]

scelw 117 Messages postés mercredi 3 septembre 2003Date d'inscription 17 février 2007 Dernière intervention - 23 nov. 2004 à 19:11 - Dernière réponse : scelw 117 Messages postés mercredi 3 septembre 2003Date d'inscription 17 février 2007 Dernière intervention
- 13 déc. 2004 à 15:14
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...

merci pour votre aide!!!!
Afficher la suite 

Votre réponse

23 réponses

Meilleure réponse
scelw 117 Messages postés mercredi 3 septembre 2003Date d'inscription 17 février 2007 Dernière intervention - 13 déc. 2004 à 15:14
3
Merci
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.)

thx

Merci scelw 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de scelw
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 23 nov. 2004 à 19:27
0
Merci
Mets un Sleep(1); dans ta boucle. Si ce n'est pas suffisant, augmente le nombre juska ske ca le devienne, mais normalement, pas de pb.

++

+2(p - n)
Commenter la réponse de cs_AlexMAN
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 23 nov. 2004 à 19:30
0
Merci
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.

Bonne chance

++

+2(p - n)
Commenter la réponse de cs_AlexMAN
scelw 117 Messages postés mercredi 3 septembre 2003Date d'inscription 17 février 2007 Dernière intervention - 23 nov. 2004 à 19:53
0
Merci
j'utilise pas de threads mais par contre, pour utiliser la fonction Sleep() fo pas ajouter des includes particuliers??
THX !
Commenter la réponse de scelw
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 23 nov. 2004 à 19:58
0
Merci
#include <windows.h> devrait suffire.

+2(p - n)
Commenter la réponse de cs_AlexMAN
plus_plus_fab 232 Messages postés vendredi 9 janvier 2004Date d'inscription 8 janvier 2005 Dernière intervention - 23 nov. 2004 à 20:45
0
Merci
salut,

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.
Commenter la réponse de plus_plus_fab
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 23 nov. 2004 à 20:52
0
Merci
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...

+2(p - n)
Commenter la réponse de cs_AlexMAN
cs_Matt67 554 Messages postés samedi 6 septembre 2003Date d'inscription 6 mars 2010 Dernière intervention - 23 nov. 2004 à 21:31
0
Merci
Bonsoir,

Essaye ca :

void DoEvents()
{
MSG msg;
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

Matt...
Commenter la réponse de cs_Matt67
plus_plus_fab 232 Messages postés vendredi 9 janvier 2004Date d'inscription 8 janvier 2005 Dernière intervention - 23 nov. 2004 à 21:41
0
Merci
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 ...
Commenter la réponse de plus_plus_fab
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 23 nov. 2004 à 22:09
0
Merci
Sous Windows avec CreateProcess, on regle le niveau de priorite dans le membre dwCreationFlags.
ET C'EST CERTAIN.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
cs_eRoZion 241 Messages postés vendredi 23 mai 2003Date d'inscription 8 octobre 2007 Dernière intervention - 24 nov. 2004 à 00:27
0
Merci
T'essaie de facto de la clef publique?

eRoZion
Commenter la réponse de cs_eRoZion
scelw 117 Messages postés mercredi 3 septembre 2003Date d'inscription 17 février 2007 Dernière intervention - 24 nov. 2004 à 16:25
0
Merci
>> Matt67, j'ai essayé cette méthode mais g plusieurs erreurs... faut-il ajouter un include particulier ??

> c'est pas de la clef publique mais c'est des maths crypographiques, effectivement.

... pourriez-vous être plus explicite dans vos explications car je suis néophyte. :) thx!!
Commenter la réponse de scelw
cs_Vincent12 3 Messages postés dimanche 14 novembre 2004Date d'inscription 24 novembre 2004 Dernière intervention - 24 nov. 2004 à 18:27
0
Merci
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...
Commenter la réponse de cs_Vincent12
cs_Vincent12 3 Messages postés dimanche 14 novembre 2004Date d'inscription 24 novembre 2004 Dernière intervention - 24 nov. 2004 à 18:30
0
Merci
SUITE :

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 ????
Commenter la réponse de cs_Vincent12
plus_plus_fab 232 Messages postés vendredi 9 janvier 2004Date d'inscription 8 janvier 2005 Dernière intervention - 24 nov. 2004 à 20:12
0
Merci
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.
Commenter la réponse de plus_plus_fab
scelw 117 Messages postés mercredi 3 septembre 2003Date d'inscription 17 février 2007 Dernière intervention - 25 nov. 2004 à 10:12
0
Merci
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!! :)
Commenter la réponse de scelw
scelw 117 Messages postés mercredi 3 septembre 2003Date d'inscription 17 février 2007 Dernière intervention - 5 déc. 2004 à 11:27
0
Merci
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!!!!
Commenter la réponse de scelw
scelw 117 Messages postés mercredi 3 septembre 2003Date d'inscription 17 février 2007 Dernière intervention - 5 déc. 2004 à 12:19
0
Merci
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

Error executing cl.exe.

first gen.exe - 7 error(s), 2 warning(s)
Commenter la réponse de scelw
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 5 déc. 2004 à 12:29
0
Merci
windows.h suffit...

+2(p - n)
Commenter la réponse de cs_AlexMAN
scelw 117 Messages postés mercredi 3 septembre 2003Date d'inscription 17 février 2007 Dernière intervention - 5 déc. 2004 à 16:43
0
Merci
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!

THANKS
Commenter la réponse de scelw

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.