Cody O'Meara Ответов: 2

Я показываю картинку, которая меняется каждые 10 секунд, изображение не отображается с резьбой?


Я использую цикл do until, который меняет изображение каждые 10 секунд. Это будет скорректировано, но установлено только на 10 для целей тестирования. У меня есть 4 изображения (1.jpg-4.jpg) теоретически он должен изменить фотографию на 1-ю фотографию, подождать 10 секунд, перейти на 2-ю фотографию, подождать 10 секунд и так далее, но фотография не отображается. Я удалил резьбу, и на экране появилось последнее изображение.


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim picNum As Integer = 0

    'Start Displaying images
    Do Until picNum = 4
        picNum = picNum + 1
        mainpbx1.ImageLocation = "F:\Programs\TV\" & picNum & ".jpg"
        Threading.Thread.Sleep(10000)
    Loop
End Sub


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

I tried doing a Timer( I always use threading for stuff like this) and couldn't get it to be right. I had Timer enabled with 8 second interval but it didn't seem to be waiting after it Timer1.start() 

2 Ответов

Рейтинг:
2

Andy Lanng

Ух. Это может быть сложно, если вы не привыкли к многопоточным winforms. Есть некоторые готы, которые мы все попали в свое время.

Так вот в чем проблема: У вас есть 1 поток, который рисует графический интерфейс. Вы создаете другой поток, чтобы изменить какое-то свойство для первого потока рисования. Единственная проблема в том, что первый поток об этом не знает. Вы изменили его на другой нити и не говорите первой.

Вот хороший способ реализации потокового процесса, который сообщает первому потоку, что что-то меняется.


Обновление формы из другого потока без создания делегатов для каждого типа обновления[^]

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

Удача ^_^


Dave Kreskowiak

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

Andy Lanng

УК - ок, но он должен быть фоном для этого ^_^
Нет, твое право. Может быть, кто-то найдет ссылку полезной, посмотрев на этот пост

Рейтинг:
19

Richard Deeming

С помощью Thread.Sleep вызывает замораживание потока пользовательского интерфейса. Он не может обрабатывать никакие сообщения, а это значит, что он не может перекрасить себя, чтобы показать выбранное изображение.

Использовать Timer чтобы обновить ваши изображения вместо цикла:
Класс Таймера (System.Окна.Формы) | Microsoft Docs[^]

Private picNum As Integer
Private picTimer As System.Windows.Forms.Timer

Private Sub ShowCurrentPicture()
    mainpbx1.ImageLocation = "F:\Programs\TV\" & picNum & ".jpg"
End Sub

Private Sub ShowNextPicture()
    picNum = picNum + 1
    ShowCurrentPicture()
    If picNum = 4 Then 
        picTimer.Enabled = False
    End If
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If picTimer Is Nothing Then
        picTimer = New System.Windows.Forms.Timer()
        AddHandler picTimer.Tick, AddressOf ShowNextPicture
        picTimer.Interval = 10000
    End If
    
    If Not picTimer.Enabled Then
        picNum = 1
        ShowCurrentPicture()
        picTimer.Enabled = True
    End If
End Sub


Cody O'Meara

работать отлично. Спасибо!