2011-01-13 12 views
0

他のプロセスメモリを読み取るアプリケーションがあります。私は最初に読む必要のあるさまざまな領域に対して複数のスキャンスレッドを持っていました。これはプロセッサーが集中していたので、私はオブザーバーのパターンと一緒に行くことにしました。私は奇妙な行動をしていることを除いて、すべてがうまくいった。Observerパターンを使用した奇妙な動作

は、ここで私は2つのレーダー(オーバーレイおよびマッピングされた)メモリスキャナに取り付けられ、暴徒の新しいリストに通知されたウォッチャクラスを持っている両方を持っている

を何が起こっているかです。

ので、私はそれがMOBリスト更新通知をスキャナを待つに

オープンレーダ2(オーバーレイ)ウォッチャーの付着レーダ1(マップされた)を開きます。同じことが起こり、別のウォッチャーが付いています。

これまでのところすべてがうまくいいです。 リストのmobsには、そのうちの1つがIsFilteredOutです。このプロパティは、リストを受け取ったレーダーコードで設定されます。

私が何をするにしても、開かれる第2のレーダーは両方のレーダーのリストにあるmobのすべてのプロパティを変更します。あたかも私がrefでリストを渡しているかのようですが、私はそうではありません。私は実際にリストを渡すたびにmoblistクラスの新しいインスタンスを作成します。

ここに通知コードがあります。ご覧のとおり、私はmoblistクラスの新しいインスタンスを作成します。それはウォッチャークラス

''' <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 

で処理され、このエラーは私にナットを駆動して、任意の助けを大幅に高く評価されるであろう場所

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 

です。

おかげ

答えて

1

は、私が実際に私はリストを渡すたびにmoblistクラスの新しいインスタンスを作成します。

リストは、リスト要素ではなく、変更されません。あなたは要素オブジェクトも同様に複製する必要があります。私はレーダーやmobsの手掛かりを持っていない、あなたはポストの代わりに送信を使用することを検討する可能性があります。

+0

ありがとうございます、あなたは正しい方向に私を指摘しました。実際にUIのコードを変更して、リストのクローンを取得しました。 – bhmahler

関連する問題