Boucle à faible ressource mémoire ?

aluccard Messages postés 22 Date d'inscription mercredi 30 mai 2007 Statut Membre Dernière intervention 11 octobre 2007 - 9 oct. 2007 à 15:37
aluccard Messages postés 22 Date d'inscription mercredi 30 mai 2007 Statut Membre Dernière intervention 11 octobre 2007 - 11 oct. 2007 à 15:26
bonjour,

j'ai une application VB.net qui se met en attente de fermeture d'une fenêtre msDOS.

J'avais fait une boucle de ce type

Do
           ProcessMSDOS = System.Diagnostics.Process.GetProcessesByName("cmd")
            HandleMSDOS = ProcessMSDOS(0).MainWindowHandle
Loop Until (HandleMSDOS = 0)

mais j'ai remarqué que mon application exe augmentait enormémement en mémoire a cause de cette boucle. Je voudrais quelques conseils pour y remédier svp.

J'ai aussi mit une un messagebox a la place de ce code
MessageBox.Show("Attendez la fermeture de la fenêtre MSDOS puis appuyer sur OK.", "TERMINE")

mais le soucis est que si l'utilisateur appuis sur OK est que la fenêtre n'est pas terminé, ça pose des soucis vu la suite du code.

qu'avez vous a me conseillé, je pensais a garder la messagebox mais ne pas rendre possible l'appui sur la touche OK (je ne sais pas comment faire ceci) et permettre l'appuis sur la touche OK quand la fenêtre MSDOS est fermé (mais ça m'oblige a faire une boucle non?)

merci

2 réponses

SMaverick Messages postés 8 Date d'inscription lundi 19 juillet 2004 Statut Membre Dernière intervention 11 octobre 2007
11 oct. 2007 à 03:32
Salut,
Je fais pas du Vb.net, mais du Vb!
Dans les boucles il faut toujours penser a donner la main au system pour qu'il traite les autre evenement et taches .... en Vb on utilise Doevents, ça dois etre le meme je pense en vb.net

en plus obtenir le Process de "cmd" a chaque loop est une perte de temps et de ressource, obtien cet info une fois au debut avant la boucle.

En plus, la boucle en question verifie chaque fois qu'elle le peut la fermeture ou non de la fenetre MsDos, ce qui est mal conçu, tu peux ajouter au milieu de la boucle, en plus du Doevents, un fonction qui gele le processus pendant 0.5 seconde,  l'Api Sleep par exemple!

Private

Declare
Sub Sleep
Lib
"kernel32" (
ByVal dwMilliseconds
As
Long)

ProcessMSDOS = System.Diagnostics.Process.GetProcessesByName("cmd")

Do
    Doevents           'ou son equivalent en Vb.net
   HandleMSDOS = ProcessMSDOS   (0).MainWindowHandle

  Sleep 500    'le thread actuel est gelé pendan 500  
pendant 500miliseconds

Loop Until (HandleMSDOS = 0)

si ton application doit réagir a des evenement durant cet
boucle Sleep est un peu déconseillé, ça depend de ce que tu veux faire.

bon courrage
0
aluccard Messages postés 22 Date d'inscription mercredi 30 mai 2007 Statut Membre Dernière intervention 11 octobre 2007
11 oct. 2007 à 15:26
merci de ton aide, reste encore un détail a régler.

en fait voici le code utilisé :
------------------------------------------------------------------------------------------------------------

ProcessMSDOS = System.Diagnostics.Process.GetProcessesByName("cmd")
            Do
                System.Windows.Forms.Application.DoEvents()
                ProcessMSDOS = System.Diagnostics.Process.GetProcessesByName("cmd")
                HandleMSDOS = ProcessMSDOS(0).MainWindowHandle

                Sleep(500)    'le thread actuel est  pendant 500miliseconds

            Loop Until (HandleMSDOS = 0)
-------------------------------------------------------------------------------------------------------------

                ProcessMSDOS =
System.Diagnostics.Process.GetProcessesByName("cmd") 'cette ligne a été
rajouté dans la boucle DO...LOOP car je récuperais le handle de ma fenetre MSDOS du début et
donc, lorsque ma fenetre MSDOS se fermait, je continuais a boucler
indéfiniment.

Pour information ma fenetre MSDOS est un fichier bat que je lance et qui se ferme tout seul apres avoir finit son exécution.
Sinon l'idée est tres bonne mais me reste un détail important a régler qui est :

Lorsque ma fenêtre MSDOS se ferme, j'ai une exception sur la ligne "Index was outside the bounds of the array."
HandleMSDOS = ProcessMSDOS(0).MainWindowHandle
car tout simplement, si la fenetre se ferme au mauvais moment, j'ai toujours cette exception qui recherche le handle de la fenêtre MSDOS mais qui n'arrive pas a le trouver car la fenetre s'est fermée. En fait  si ma fenetre se ferme quand je suis au niveau de ces lignes de codes,
System.Windows.Forms.Application.DoEvents()
ProcessMSDOS = System.Diagnostics.Process.GetProcessesByName("cmd")
l'exception apparait.

c'est un des gros soucis de mon programme, j'ai beaucoup de boucle qui sont en attente d'une fermeture de programme, le DOEVENTS me permet de regler le soucis de ressource mémoire mais pas ce soucis de boucle.

il y a t il un moyen d'améliorer ce genre de bouclage (hormis la mise en place de thread qui je l'avoue aurait été beaucoup mieux mais bon je suis qu'un padawan en VB.net encore

merci et n'hésitez pas a me demander plus de détails
0
Rejoignez-nous