aluccard
Messages postés22Date d'inscriptionmercredi 30 mai 2007StatutMembreDernière intervention11 octobre 2007
-
9 oct. 2007 à 15:37
aluccard
Messages postés22Date d'inscriptionmercredi 30 mai 2007StatutMembreDernière intervention11 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?)
SMaverick
Messages postés8Date d'inscriptionlundi 19 juillet 2004StatutMembreDernière intervention11 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)
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