В то время как цикл заставляет приложение работать медленно? Есть идеи почему? - PullRequest
0 голосов
/ 08 января 2010

У меня есть простой код, который ищет текстовый файл, читает строку текста, разбивает строку на точки с запятой и затем публикует результаты.

После того, как это было сделано, я создал действительно простой цикл while, который тратит 10 секунд, прежде чем идти на него снова ... вот код:

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

Но когда дело доходит до цикла «тратить время» - кажется, что оно замедляет работу всего приложения? И я не могу понять, почему!

Итак, пара вопросов ... есть ли лучший способ сделать все это? и второе - кто-нибудь может обнаружить проблему?

Кажется, все остальные команды работают нормально - в этом приложении больше ничего нет. У меня есть другая программа, которая обновляет файл данных значениями, это просто приложение на стороне клиента для вывода температуры.

Любая помощь будет оценена.

Andrew


Дополнительная информация:

Я должен объяснить, что делает подпрограмма pollInterval!

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

Ответы [ 2 ]

2 голосов
/ 08 января 2010

Ваш цикл является очень узким циклом, непрерывно вызывающим pollInterval. Это будет связывать приложение, пока не будет выполнено условие цикла.

Вы должны использовать метод Sleep, чтобы приостановить эту цепочку на необходимое время.

Если вы хотите показать прогресс (согласно вашему обновлению), вы можете поместить Sleep в цикл и спать в течение 1 секунды (или полсекунды?) За раз:

        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 голосов
/ 08 января 2010

Вы должны пойти с

System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10).TotalMilliseconds);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...