Страница: 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 Автор ответа: 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)
 im _Delegate As New DelegateSub(AddressOf SetText1)
Label1.Invoke(_Delegate, ar1.ToString)
End Sub
Private Sub ReceiverCallback2(ByVal ar2 As Integer)
 im _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 |
Поиск по форуму