Многопоточность. Суммирование из нескольких потоков.

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

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

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Многопоточность. Суммирование из нескольких потоков.

Сообщение student-uni » 08.08.2006 (Вт) 13:07

Есть событие
Код: Выделить всё
AddHandler m_PacketMonitors(0).NewPacket, AddressOf Me.OnNewPacket


Есть обработчик вычисляюшии размер и прочие данные

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

Private Sub OnNewPacket(ByVal m As Monitor, ByVal p As Packet)
        Dim lstItem As ListViewItem = New ListViewItem
        Dim _AddPacket As AddPacket

        m_Packets.Add(p)
        m_PacketsSize += p.TotalLength
        Try
            With lstItem
                .Text = p.Time.ToString
                .SubItems.Add(p.Protocol.ToString)
                .SubItems.Add(p.Source.ToString)
                .SubItems.Add(p.Destination.ToString)
                .SubItems.Add(p.TotalLength.ToString)
            End With
            _AddPacket = New AddPacket(AddressOf AddMyPacket)
            Dim r As IAsyncResult = BeginInvoke(_AddPacket, New Object() {lstItem, m_Packets.Count, m_PacketsSize})

        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub



Похоже Каждыи раз при обработке события создается отдельныи поток.

Далее обеспечивается доступ к елементу управления Лист вью
из разных потоков.

Код: Выделить всё
Private Sub AddMyPacket(ByVal lstItem As ListViewItem, ByVal PacketCount As Long, ByVal PacketSize As Double)


        PacketList.Items.Add(lstItem)
        'StatusBar.Text = String.Format("Intercepted {0} packet(s) [{1} bytes]", PacketCount, PacketSize)
    End Sub




А как обеспечить доступ к переменнои
если я хочу просуммировать данные p.TotalLength из етих потоков ?


Спасибо

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 08.08.2006 (Вт) 14:54

Похоже Каждыи раз при обработке события создается отдельныи поток
Не проверяя трудно сказать, похоже это на то или нет, но если по твоему похоже, то все содержимое функции OnNewPacket следует обязательно запихнуть в SyncLock что бы избежать ошибок совместного доступа.
А как обеспечить доступ к переменнои
А в чем собственно заключается сложность общения с переменной?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 09.08.2006 (Ср) 9:55

все содержимое функции OnNewPacket следует обязательно запихнуть в SyncLock


А как её запихнуть а Синк Лок ?
Код черкни пож-ста.

В этой функции присваивается значение lstItem
(строчка которая пойдёт в ЛистВью)
и похоже каждый поток имеет свою копию этого lstItem
Проблемы пока не возникает.
Проблема возникнет при попытке засунуть эту строчку
в сам элемент управления ЛистВью внутри этой же функции OnNewPacket

Если переместить
PacketList.Items.Add(lstItem)
в OnNewPacket (туда же где формируется строчка lstItem)
возникнет ошибка доступа к элементу управления
Поэтому эта операция вынесена отдельно в AddMyPacket
и запускается
Dim r As IAsyncResult = BeginInvoke(_AddPacket, New Object() {lstItem, m_Packets.Count, m_PacketsSize})

Я вписал в AddMyPacket возможность суммирования и сделал это через глобальную переменную.
Переформулирую вопрос

Можно ли полагать, что подобный запуск AddMyPacket равно как
и всё её содержимое ни при каких обстоятельствах
не будет использовано двумя потоками сразу ?

А в чем собственно заключается сложность общения с переменной?


В том, что глобальные переменные не потокобезопасны.
Равно как и элементы управления.
Если два потока используют одну и туже глобальную переменныю
то есть малая вероятность ошибочных данных в ней.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 09.08.2006 (Ср) 10:13

как то так

Код: Выделить всё
SyncLock lstItem

' тут собственно код

End SyncLock


подробности в MSDN.
Весь мир матрица, а мы в нем потоки байтов!

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 09.08.2006 (Ср) 10:55

В том, что глобальные переменные не потокобезопасны.
Тогда ответ - synclock.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 90

    TopList