Nicomendox Ответов: 3

Пока таймер работает, почему форма не может двигаться правильно ?


Я пишу простой код с таймером. но когда я запускаю таймер, а затем, когда я пытаюсь переместить форму с помощью мыши рассвета или когда я пытаюсь нажать кнопку ответа с задержкой.

Что я делаю не так ?

Что я уже пробовал:

Public Class Form3
    Dim _RGB As Integer
    Dim renk As Color
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim hiz As Double
        hiz = -0.4

        For i = 256 To 0 Step hiz
            _RGB = RGB(i, 0, 0) 'VScrollBar1.Value, 0, 0) ', VScrollBar2.Value, VScrollBar3.Value)
            renk = ColorTranslator.FromOle(_RGB)
            'RectangleShape1.FillColor = renk
            PictureBox1.BackColor = renk
            PictureBox1.Refresh()
        Next i

        For i = 256 To 0 Step hiz
            _RGB = RGB(0, i, 0) 'VScrollBar1.Value, 0, 0) ', VScrollBar2.Value, VScrollBar3.Value)
            renk = ColorTranslator.FromOle(_RGB)
            'RectangleShape1.FillColor = renk
            PictureBox2.BackColor = renk
            PictureBox2.Refresh()
        Next i

        For i = 256 To 0 Step hiz
            _RGB = RGB(0, 0, i) 'VScrollBar1.Value, 0, 0) ', VScrollBar2.Value, VScrollBar3.Value)
            renk = ColorTranslator.FromOle(_RGB)
            'RectangleShape1.FillColor = renk
            PictureBox3.BackColor = renk
            PictureBox3.Refresh()
        Next i



    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        If Timer1.Enabled = False Then
            Timer1.Start()
        Else
            Timer1.Stop()
        End If
    End Sub
End Class

3 Ответов

Рейтинг:
2

Patrice T

Цитата:
Что я делаю не так ?

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

В чем же причина этого Timer1_Tick то, как ты это сделал ?


Рейтинг:
2

Doug- VisualBasic VB.NET

Внутри каждого цикла for - next используйте приложение.doevents, так что вам нужно будет поставить его в 3 раза.

For i = 256 To 0 Step hiz
          Application.Doevents
         _RGB = RGB(i, 0, 0) 'VScrollBar1.Value, 0, 0) ', VScrollBar2.Value, VScrollBar3.Value)
            renk = ColorTranslator.FromOle(_RGB)
            'RectangleShape1.FillColor = renk
            PictureBox1.BackColor = renk
            PictureBox1.Refresh()
        Next i

Это позволяет системе отслеживать движения мыши, щелчки или другие необходимые для реагирования события. Вы не показываете, как долго длится ваш таймер. Вы также можете подумать о том, чтобы поставить более длительное время между тиками, чтобы также позволить системе реагировать. В зависимости от того, сколько времени это займет, и длины ваших тиков таймера, я бы также добавил timer.stop в качестве первой строки события и добавил timer.start в качестве последней строки. Это предотвратит запуск нескольких событий и реальное использование ресурсов.

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

Другой подход заключается в использовании отдельного потока для событий таймера. Но это будет зависеть от общего желаемого эффекта и размера программы.


Рейтинг:
1

RickZeeland

Ваши жесткие петли не позволяют пользовательскому интерфейсу отвечать на запросы.
Регулярно используйте Приложение.Метод DoEvents (System.Окна.Формы) | Microsoft Docs[^]