Странное поведение с использованием паттерна Observer - PullRequest
0 голосов
/ 13 января 2011

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

Вот что происходит

У меня есть 2 радара (наложение и отображение). Оба имеют класс наблюдателя, который подключается к сканеру памяти и уведомляется о новом списке мобов.

поэтому я открываю радар 1 (сопоставленный), он прикрепляет наблюдателя к сканеру и ждет уведомлений об обновлении списка мобов

Открытый радар 2 (наложение). происходит то же самое, и прикрепляется другой наблюдатель.

пока все хорошо Теперь в списке мобов есть свойства, одним из которых является IsFilteredOut. Это свойство устанавливается в коде радара после получения списка.

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

Вот код уведомления. Как вы можете видеть, я создаю новый экземпляр класса moblist каждый проход.

Private Sub NotifyMobListUpdated(ByVal Mobs As List(Of MobData))
    If Mobs IsNot Nothing Then
        For Each w As Watcher In _watchers
            If w.Type And WatcherTypes.MobList = WatcherTypes.MobList OrElse w.Type And WatcherTypes.All = WatcherTypes.All Then
                w.MobListUpdated(New MobList(Mobs))
            End If
        Next
    End If
End Sub

Это то место, где оно обрабатывается в классе Watcher

''' <summary>
''' IWatcher MoblistUpdated Implementation
''' </summary>
''' <param name="Mobs">The Updated mob list</param>
''' <remarks></remarks>
Public Sub MobListUpdated(ByVal Mobs As MobList) Implements IWatcher.MobListUpdated
    Try
        PostNewMobList(Mobs)
    Catch ex As Exception
    End Try
End Sub

Public Sub PostNewMobList(ByVal Mobs As MobList)
    _sync.Post(New SendOrPostCallback(AddressOf OnNewMobList), Mobs)
End Sub

Private Sub OnNewMobList(ByVal state As Object)
    Dim mobs As MobList = TryCast(state, MobList)
    Try
        If mobs IsNot Nothing Then
            RaiseEvent NewMobList(mobs)
        End If
    Catch ex As Exception
    End Try
End Sub

Эта ошибка сводит меня с ума, и любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

1 голос
/ 13 января 2011

Я фактически создаю новый экземпляр класса moblist каждый раз, когда передаю список.

, который только предотвращает изменение списка , но не элементов списка.Вам также нужно будет клонировать объекты-элементы.Я понятия не имею, как работают радары и мобы, возможно, вы захотите использовать Send вместо Post.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...