Многопоточнось и MsgBox

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

VAngel
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 81
Зарегистрирован: 13.01.2005 (Чт) 0:10
Откуда: 2:5030

Многопоточнось и MsgBox

Сообщение VAngel » 14.01.2006 (Сб) 15:58

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

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

Код: Выделить всё
    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)

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

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 14.01.2006 (Сб) 23:38

Разберись с BackGroundWorker и не изобретай велосипед.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

VAngel
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 81
Зарегистрирован: 13.01.2005 (Чт) 0:10
Откуда: 2:5030

Сообщение VAngel » 15.01.2006 (Вс) 12:11

На другом форуме подсказали, как доделать велосипед :)
А BackGroundWorker я смотрел, но чего-то ничего не понял … :(
В общем, решение вот такое:

Код: Выделить всё
Class otherProcess

        Public sAlertMessage As String

        Public Sub AlertMessageShow()
            MsgBox(sAlertMessage.ToString)
        End Sub

    End Class


    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
            Dim otPOC As New otherProcess
            otPOC.sAlertMessage = "Ошибка 404 №" & i
            l(i) = New Threading.Thread(AddressOf otPOC.AlertMessageShow)
            l(i).Name = "Message N" & i
            l(i).Start()
        Next
    End Sub


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44

    TopList