Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: vb.net многопоточность Добавлено: 14.01.06 20:50  

Автор вопроса:  Ilja | ICQ: 216590354 
Пытался работать с многопоточностью и сразу наткнулся на проблему, поковырявшись понял, что ничего у меня не получаеться.... :(

Собственно есть код который довольно долго обрабатываеться и в результате его работы программа останавливаеться, и уж очень не хочеться что бы так происходило. Т. е. я хочу создать отдельный процесс который будет обрабатываться отдельно.... для этого делую так:

    Dim sAlertMessage As String

    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", с чем связано в принципе понятно, два процесса считывают переменную котора не успела измениться, вопрос в том как этого избежать?

Пытался прописать функцию вот так:

Sub AlertMessageShow(ByVal sAlertMessage As String)

И соотвецственно так:

l(i) = New Threading.Thread(AddressOf AlertMessageShow("Ошибка 404" & vbCrLf & i))


но он ругаеться что 'AddressOf' opersnd must be the name of method(without parenthes)

Помучевшись еще немного, понял что надо у когонить узнать :)
А теперь внимание вопрос: Как мне вообще передать в процесс хоть какую нибудь информацию строку ну или на крайний случай индекс?

Ответить

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

Номер ответа: 1
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #1
Добавлено: 15.01.06 11:16
Выделить функционал потока в отельный класс.

Friend Class ProcessWorker
  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)

Ответить

Страница: 1 |

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



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