Probleme de loop

Résolu
flatron123 Messages postés 49 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 29 juin 2008 - 26 mai 2008 à 20:06
flatron123 Messages postés 49 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 29 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...

Merci de votre aide.

flatron

12 réponses

Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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.... )
3
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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
3
flatron123 Messages postés 49 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 29 juin 2008
26 mai 2008 à 20:07
PS. ne pas tenir compte des paths.

Merci

flatron
0
Utilisateur anonyme
26 mai 2008 à 20:17
Salut,

Pourquoi un Thread.Sleep(10000) ?
Ca frezze pendant 10s à chaque itération 

__________
  Kenji
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 mai 2008 à 20:21
Met plutot un Application.DoEvents

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
flatron123 Messages postés 49 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 29 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" ???

Merci à tous

flatron
0
flatron123 Messages postés 49 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 29 juin 2008
26 mai 2008 à 20:56
plus exactement, comment peut-on stopper la boucle (et uniquement) pendant un temps donne ?

merci

flatron
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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.
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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)
0
flatron123 Messages postés 49 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 29 juin 2008
26 mai 2008 à 21:29
J' ai c/c ton texet mais j'ai quand meme un probleme avec le timer (oui j'avais deja essaye de changer le nom).

"Timer est ambigu, import2 des esoaces de noms ou des types 'Systeme.threading,system.windows.forms'.
0
flatron123 Messages postés 49 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 29 juin 2008
26 mai 2008 à 22:27
Je viens de trouver a l'instant :d.

Je vais plutot desimporter le thread (puisque il ne me sert a plua rien maintenant). Merci pour ton aide :)
0
flatron123 Messages postés 49 Date d'inscription mardi 11 mars 2008 Statut Membre Dernière intervention 29 juin 2008
26 mai 2008 à 22:27
Je viens de trouver a l'instant :d.

Je vais plutot desimporter le thread (puisque il ne me sert a plua rien maintenant). Merci pour ton aide :)
0
Rejoignez-nous