flatron123
Messages postés49Date d'inscriptionmardi 11 mars 2008StatutMembreDernière intervention29 juin 2008
-
26 mai 2008 à 20:06
flatron123
Messages postés49Date d'inscriptionmardi 11 mars 2008StatutMembreDernière intervention29 juin 2008
-
26 mai 2008 à 22:27
Bonjour a tous,
J'ai un soucis dans une boucle. En fait, je lance une boucle qui inscrit dans un fichier texte une ligne. Le soucis est qu'apres que j'ai lance ma boucle, celle-ci fonctionne bien mais le programme en lui-meme bug completement, et est inaccessible (bien que la boucle inscrive toujours), Voici le code:
Do While txtAltitude.Text.ToString > 0
If ComboBox3.SelectedIndex = 0 Then
Thread.Sleep(10000)
FileCopy("C:..", "C:\..")
myDLL.AjouteLigneFichierTexte("C:..", pos, 1)
FileCopy("C:\Documen", "C:\Documents")
myDLL.AjouteLigneFichierTexte("C:..", "</coordinates>", 1)
myDLL.AjouteLigneFichierTexte("C:..", "</LineString>", 1)
myDLL.AjouteLigneFichierTexte("C:..", "
", 1)
myDLL.AjouteLigneFichierTexte("C:..","</Document>", 1)
myDLL.AjouteLigneFichierTexte("C:..", "</kml>", 1)
End If
Loop
Une idee?
On peut faire un "exit do" mais vu qu'il y a comme un freeze je ne sais pas...
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 26 mai 2008 à 20:25
Salut,
1. Tu fais des FileCopy (copie de fichier je suppose) et des AjouteLigneFichierTexte (je suppose ecriture dans un fichier): ceci est très lent.
2. Tu fais un Thread.Sleep(10000) (C'est donc une pause blocante de 10 secondes à chaque itération de ta boucle!!!)
Donc pas étonnant que ca "freeze". Je te propose de faire ton traitement en mémoire, puis d'écrire le fichier une fois fini. Puis pour ton Thread.Sleep, je ne vois pas l'intéret à par si le but est de freezer ton appli. Remplace le par Application.DoEvents si ton traitement est vraiment trop long.
Encore qq remarque: Ton myDLL je suppose que c'est une classe que tu as créé. Je suis sur que IO.File.AppendText est 10 fois plus rapide. Mais un IO.File.CreateText à la fin est encore beaucoup plus rapide. Même chose pour ton FileCopy, IO.File.Copy est certainement beaucoup plus rapide.
Une petite dernière sans grande importance: txtAltitude.Text retourne un String, donc inutile d'ajouter .ToString (Tu peux aussi écrire txtAltitude.Text.ToString.ToString.ToString.ToString.... )
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 26 mai 2008 à 21:34
Ah oui je vois. C'est parce que tu as importé le namespace "Systeme.threading" qui lui aussi contient une classe nommé Timer, tout comme le namespace "System.Windows.Forms" importé par défaut (c'est celui-là qu'on veut)
Donc suffit d'écrire le chemin complet :
Private WithEvents Timer1 As New System.Windows.Forms.Timer
flatron123
Messages postés49Date d'inscriptionmardi 11 mars 2008StatutMembreDernière intervention29 juin 2008 26 mai 2008 à 20:38
Oula oula oula :)
Merci à tous pour vos reponses.
Alors, explication de mon code de debutant:
Charles:
Le thread.sleep: en fait, je veux selectionner dans ma combobox un temps de "rafraichissement". (J'arrive pas avec un timer, on me parle d'ambiguité lorsque je declare le nom :s)
Kevin:
Effectivement, j'utilise une classe mydll (trouvé ici d'ailleurs).
Merci pour le "tostring" j'ai toujours un doute donc...
Par contre, au niveau de l'agencement de la copie, je ne peux pas le changer car j'ecris sur un fichier, qui se copie ailleurs pour l'ajout du "end".
Merci pour l'append text et le file copy.
Par contre comment gerer le temps avec le "application.doevents" ???
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 26 mai 2008 à 21:07
"Le thread.sleep: en fait, je veux selectionner dans ma combobox un
temps de "rafraichissement". (J'arrive pas avec un timer, on me parle
d'ambiguité lorsque je declare le nom :s)"
Ah oui, donc cette boucle ne tourne pas indéfiniment, mais juste à intervals régulier (10 sec dans ton code)
Pour ce qui est du timer, tu as essayé de changer son nom?
Une Form contenant une ComboBox avec des items de 1 à 10 (secondes):
Private WithEvents Timer1 As New Timer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.ComboBox1.SelectedIndex = 0 ' Au lancement, interval de 1 sec
Me.Timer1.Start() ' Démarrer le timer
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Me.Timer1.Interval = Me.ComboBox1.SelectedItem * 1000 ' Changement de l'interval
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
' Faire ton traitement ici
End Sub
Le seul truc qui n'est pas parfait, c'est que lorsque on change l'interval du timer, celui ci recommence de compter. Donc si par ex on met un interval de 10 sec, et que 9 sec après on change l'interval pour mettre 5 sec, l'interval total aura été de 9+5 = 14 sec.
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 26 mai 2008 à 21:13
"plus exactement, comment peut-on stopper la boucle (et uniquement) pendant un temps donne?"
On utilise des trucs bloqueurs (je ne sais plus le nom) pour faire des synchro entre différents threads, mais ca ne s'applique pas dans ton cas (le scénario serait de te synchroniser avec un timer se trouvant sur un autre thread, ce qui est fait dans la classe Timer)