Страница: 1 |
Страница: 1 |
Вопрос: Потоки + Windows.Froms
Добавлено: 21.06.09 18:30
Автор вопроса: -=Fenix=-
Делаю
Public Class Main
Public Temp As New Temp
Private Sub bStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bStop.Click
Temp.StopFlag = True
bStart.Enabled = True
End Sub
Private Sub bStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bStart.Click
Temp.StopFlag = False
bStart.Enabled = False
Dim t As New Thread(AddressOf Temp.DoTheWork)
t.Start(0)
Dim t2 As New Thread(AddressOf Temp.DoTheWork)
t2.Start(9999999)
End Sub
End Class
Public StopFlag As Boolean
Delegate Sub InvokeDelegate(ByVal Message As Integer)
Public Sub Print(ByVal Message As Integer)
Main.Label1.Text = Message
End Sub
Sub DoTheWork(ByVal start As Integer)
Dim Message As Integer = start
Do
Main.Label1.BeginInvoke(New InvokeDelegate(AddressOf Print), Message)
Thread.Sleep(1)
Message += 1
Loop Until StopFlag
End Sub
End Class
Вылетает с ошибкой - "Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна." на Main.Label1.BeginInvoke
А если сложить всё в один класс, то проблем нет.
Как обращаться к контролам в форме из потока? (Не используя обёртку Backgroundworker)
Ответы
Всего ответов: 1
Номер ответа: 1
Автор ответа:
Aston
ICQ: 214-179-991
Вопросов: 42
Ответов: 272
Профиль | | #1
Добавлено: 22.06.09 01:17
К контролам в форме из другого потока обращаются через делегаты, при помощи метода Invoke
Я конечно не спец по потокам, но на мой взгляд в 12 часов ночи, то ошибка в том что процедура:
Должна находится в главном потоке, тое вынеси её из Темп в главный класс, но так же класс должен видеть эту процедуру.
Проблема в том что ты создаёшь поток из класса темп, но в твоём классе есть обращение к главному потоку - ты вроде бы используешь делигат, но он ссылается на процедуру, которая принадлежит созданному потоку а не главному.