Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Потоки + Windows.Froms Добавлено: 21.06.09 18:30  

Автор вопроса:  -=Fenix=-
Делаю
Imports System.Threading

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 Class Temp
    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 часов ночи, то ошибка в том что процедура:
  1. Public Sub Print(ByVal Message As Integer)
  2.         Main.Label1.Text = Message
  3.     End Sub

Должна находится в главном потоке, тое вынеси её из Темп в главный класс, но так же класс должен видеть эту процедуру.
Проблема в том что ты создаёшь поток из класса темп, но в твоём классе есть обращение к главному потоку - ты вроде бы используешь делигат, но он ссылается на процедуру, которая принадлежит созданному потоку а не главному.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам