Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Патоки и делегаты помогите... Добавлено: 11.12.08 01:03  

Автор вопроса:  Artur
Помогите разобраться, очень простая программа создает и запускает в отдельном патоке счетчик. Собственно вопрос, когда я при оприделенном условии вызываю подпрограмму ReceiverCallback(N) и передаю в нее результат выходит ошибка:
Cross-thread operation not valid: Control 'Label1' accessed from a thread other than the thread it was created on.
Я понимаю что из патока не так просто передать данные, нужны “Делегаты”? Как их организовать не могу сообразить. Подскажите, если можно внесите изменения в код. Очень нужно.
Зарание благодару.


Public Class Form1
    Public N, T As Integer
    Public ListenerThread As Threading.Thread

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListenerThread = New Threading.Thread(AddressOf DoListen)
        ListenerThread.Start()
    End Sub

    Private Sub DoListen()
        While True
            N = N + 1
            If N > 100 Then ReceiverCallback(N) : N = 0
        End While
    End Sub


    Private Sub ReceiverCallback(ByVal ar As Integer)
        Label1.Text = ar.ToString
    End Sub
End Class

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #1
Добавлено: 11.12.08 09:50
  1.  
  2.     Private Delegate Sub DelegateSub(ByVal sender As Object)
  3.     Private Sub ReceiverCallback(ByVal ar As Integer)
  4.         Dim _Delegate As New DelegateSub(AddressOf SetText)
  5.         Label1.Invoke(_Delegate, ar.ToString)
  6.     End Sub
  7.     Private Sub SetText(ByVal obj As Object)
  8.         Label1.Text = obj
  9.     End Sub

Ответить

Номер ответа: 2
Автор ответа:
 Artur



Вопросов: 4
Ответов: 4
 Профиль | | #2 Добавлено: 11.12.08 18:41
СПАСИБО за ответ, разобрался :)
Вот программка которой можно запустить два независимых потока (их можно проследить в диспетчере задач), по каждому потоку выводится на форму информация о выполненных операциях в секунду, так же в ходе работы можно изменить приоритет потока в пуле системы. Операции считаются конечно приметивно типа 1+1 без учета затрата ресурсов на условные операции и.д. Думаю для тех кому интересно -очень наглядный пример.
Только начал заниматься .Net вот если бы показали как создавать рекурсию типа программно создавать нужные потоки со своими описанными в нем переменными на подобии одного потока.
     вот прога:)


Public Class Form1Class
    Private Delegate Sub DelegateSub(ByVal sender As Object)
    Public N, F As Integer
    Public ListenerThread1 As Threading.Thread
    Public ListenerThread2 As Threading.Thread

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListenerThread1 = New Threading.Thread(AddressOf DoListen1)
        ListenerThread2 = New Threading.Thread(AddressOf DoListen2)
    End Sub

    Private Sub DoListen1()
        While True
            N = N + 1
            If Now.Second <> F Then F = Now.Second : ReceiverCallback1(N) : N = 0
        End While
    End Sub

    Private Sub DoListen2()
        While True
            N = N + 1
            If Now.Second <> F Then F = Now.Second : ReceiverCallback2(N) : N = 0
        End While
    End Sub


    Private Sub ReceiverCallback1(ByVal ar1 As Integer)
        ;Dim _Delegate As New DelegateSub(AddressOf SetText1)
        Label1.Invoke(_Delegate, ar1.ToString)
    End Sub
    Private Sub ReceiverCallback2(ByVal ar2 As Integer)
        ;Dim _Delegate As New DelegateSub(AddressOf SetText2)
        Label2.Invoke(_Delegate, ar2.ToString)
    End Sub

    Private Sub SetText1(ByVal obj As Object)
        Label1.Text = obj & " Операцый в секунду"
    End Sub

    Private Sub SetText2(ByVal obj As Object)
        Label2.Text = obj & " Операцый в секунду"
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ListenerThread1.Start()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ListenerThread1.Abort()
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ListenerThread2.Start()
    End Sub
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        ListenerThread2.Abort()
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        If ComboBox1.SelectedIndex = 0 Then ListenerThread1.Priority = Threading.ThreadPriority.Highest
        If ComboBox1.SelectedIndex = 1 Then ListenerThread1.Priority = Threading.ThreadPriority.Normal
        If ComboBox1.SelectedIndex = 2 Then ListenerThread1.Priority = Threading.ThreadPriority.Lowest
    End Sub

    Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged
        If ComboBox2.SelectedIndex = 0 Then ListenerThread2.Priority = Threading.ThreadPriority.Highest
        If ComboBox2.SelectedIndex = 1 Then ListenerThread2.Priority = Threading.ThreadPriority.Normal
        If ComboBox2.SelectedIndex = 2 Then ListenerThread2.Priority = Threading.ThreadPriority.Lowest
    End Sub
End Class

Ответить

Страница: 1 |

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



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