2010-01-08 5 views
0

J'ai un code simple qui recherche un fichier texte, lit la ligne de texte, divise la chaîne par des points-virgules, puis affiche les résultats.Alors que la boucle ralentit l'application? Une idée pourquoi?

Après avoir fait cela, je l'ai créé un très simple en boucle à perdre 10 secondes avant d'aller à nouveau .... voici le code:

Private Sub checkTemps() 
    While Abort = False 
     Try 
      fileReader = New StreamReader(directory.Text & "currentTemp.dat") 
      rawData = fileReader.ReadLine() 
      fileReader.Close() 
      Dim dataArray() As String 
      dataArray = rawData.Split(";") 
      updateOutput("1", dataArray(0), dataArray(1)) 
      updateOutput("2", dataArray(2), dataArray(3)) 
      updateOutput("3", dataArray(4), dataArray(5)) 
      updateOutput("4", dataArray(6), dataArray(7)) 
      stpWatch.Start() 
      While stpWatch.Elapsed.Seconds < 10 And Abort = False 
       pollInterval(stpWatch.ElapsedMilliseconds) 
      End While 
      stpWatch.Stop() 
      stpWatch.Reset() 
     Catch ex As Exception 
      msgbox("oops!") 
     End Try 
    End While 
    closeOnAbort() 
End Sub 

Mais quand il arrive à la " perte de temps "boucle - il semble ralentir l'ensemble de l'application vers le bas? Et je ne peux pas comprendre pourquoi!

Alors quelques questions ... y a-t-il une meilleure façon de faire tout cela? et en second lieu - quelqu'un peut-il repérer un problème?

Toutes les autres commandes semblent fonctionner correctement - il n'y a pas grand chose d'autre à cette application. J'ai un autre programme qui met à jour le fichier dat avec les valeurs, il s'agit simplement d'une application côté client pour afficher les températures.

Toute aide serait appréciée.

Andrew


Plus d'infos:

Je dois expliquer ce que le sous pollInterval fait!

Private Delegate Sub pollIntervalDelegate(ByVal value As Integer) 
Private Sub pollInterval(ByVal value As Integer) 
    If Me.InvokeRequired Then 
     Dim upbd As New pollIntervalDelegate(AddressOf pollInterval) 
     Me.Invoke(upbd, New Object() {value}) 
    Else 
     ProgressBar1.Value = value 
    End If 
End Sub 
+0

Voir aussi, sur une note connexe, http://stackoverflow.com/questions/1664526/loop-to-check-time-in-vb-net – VonC

Répondre

2

Votre boucle est une boucle très serrée appeler sans cesse pollInterval. Cela liera l'application jusqu'à ce que la condition de boucle soit remplie.

Vous devez utiliser la méthode Sleep pour mettre ce thread en pause pendant la durée requise.

Si vous voulez montrer les progrès (selon votre mise à jour), vous pouvez mettre le Sleep dans la boucle et le sommeil pendant 1 seconde (ou une demi-seconde?) À la fois:

 While stpWatch.Elapsed.Seconds < 10 And Abort = False 
      Sleep(1000)  <-- NOT 100% sure of the syntax here, 
           but the time is specified in milliseconds 
      pollInterval(stpWatch.ElapsedMilliseconds) 
     End While 
+0

Que suggéreriez-vous? Je veux être en mesure d'afficher le temps restant avant la prochaine mise à jour en utilisant une barre de progression ... est-il un meilleur moyen? –

0

Vous devriez aller avec

System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10).TotalMilliseconds); 
+0

Mais je veux montrer la durée jusqu'à la prochaine actualisation ... si je mets le fil pour dormir - je ne serai pas capable de le montrer - le ferai-je? –

+2

Vous devrez définir un intervalle de mise à jour; Ajoutez un 'Thread.Sleep (1000)' dans votre boucle 'while' et attendez une seconde avant chaque mise à jour de l'écran –

+0

Donc vous voulez dire - Alors que stpWatch.Elapsed.Seconds <10 And Abort = False | pollInterval (stpWatch.ElapsedMilliseconds) | Thread.Sleep (1000) | End While -? –

Questions connexes