Страница: 1 |
Страница: 1 |
Вопрос: vb.net многопоточность
Добавлено: 14.01.06 20:50
Автор вопроса: Ilja | ICQ: 216590354
Пытался работать с многопоточностью и сразу наткнулся на проблему, поковырявшись понял, что ничего у меня не получаеться.... :(
Собственно есть код который довольно долго обрабатываеться и в результате его работы программа останавливаеться, и уж очень не хочеться что бы так происходило. Т. е. я хочу создать отдельный процесс который будет обрабатываться отдельно.... для этого делую так:
Sub AlertMessageShow()
MsgBox(sAlertMessage)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim l(0 To 100) As Threading.Thread
Dim i As Integer = 0
For i = 0 To 3 Step 1
l(i) = New Threading.Thread(AddressOf AlertMessageShow)
l(i).Name = "Message" & i
sAlertMessage = "Ошибка 404 №" & i
l(i).Start()
Next
End Sub
Конечно в AlertMessageShow() гораздо больше кода :), но для анализа.... Но в результате выполнения такого кода получаю не хорошие результаты:
Выскакивает как положено четыре окошка но два из них с одинаковым индексом, т.е. два окна с надписью "Ошибка 404 №2", с чем связано в принципе понятно, два процесса считывают переменную котора не успела измениться, вопрос в том как этого избежать?
Пытался прописать функцию вот так:
И соотвецственно так:
но он ругаеться что 'AddressOf' opersnd must be the name of method(without parenthes)
Помучевшись еще немного, понял что надо у когонить узнать :)
А теперь внимание вопрос: Как мне вообще передать в процесс хоть какую нибудь информацию строку ну или на крайний случай индекс?
Ответы
Всего ответов: 3
Номер ответа: 1
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #1
Добавлено: 15.01.06 11:16
Выделить функционал потока в отельный класс.
Private _SomeVariable As Int32
Friend Property SomeVariable () As Int32
Get
Return _SomeVariable
End Get
Set(ByVal value As int32)
_SomeVariable = value
End Set
End Property
Friend Sub Start ()
MessageBox.Show Me.SomeVariable.ToString()
End Sub
End Class
'...
Dim Worker As New ProcessWorker
Worker.SomeVariable = 25
Dim t As New Thread(AddressOf Worker.Start)
t.Start
Номер ответа: 2
Автор ответа:
Ilja
ICQ: 216590354
Вопросов: 3
Ответов: 11
Профиль | | #2
Добавлено: 15.01.06 11:57
Вот спасибо... Все заработало
Номер ответа: 3
Автор ответа:
Ilja
ICQ: 216590354
Вопросов: 3
Ответов: 11
Профиль | | #3
Добавлено: 16.01.06 15:36
Вопрос в догонку.... Все сделал в новом проекте все работает великолепно, а как начал в рабочий переносить возникает ошибка
Незнаю что с ней делать
InvalidOperationException
An error occurred creating the form.
See Exception.InnerException for details.
The error is: ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be
instantiated because the current thread is not in a single-threaded apartment.
вот код такой:
Public Class Form1
Class downloadProcess
Public downloadURL As String
Public downloadName As String
Public downloadStandart As String
Public Sub DownLoad()
Dim dURL As String = UCase(downloadURL)
Dim dName As String = UCase(downloadName)
Dim dStan As String = UCase(downloadStandart)
Form1.add2(dURL, dName, dStan)
End Sub
End Class
Public Sub add2(ByVal a1 As String, ByVal a2 As String, ByVal a3 As String)
MsgBox(a1 & vbCrLf & a2 & vbCrLf & a3)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim t(0 To 100) As Threading.Thread
Dim i As Integer
For i = 0 To 3
Dim dp As New downloadProcess
dp.downloadName = "name" & i
dp.downloadURL = "link" & i
dp.downloadStandart = "stan" & i
t(i) = New Threading.Thread(AddressOf dp.DownLoad)
t(i).Name = "download" & i
t(i).Start()
Next
End Sub
End Class
возникает она в строке:
Form1.add2(dURL, dName, dStan)