コンポーネントでは、アプリケーションが責任を負う必要がある間にUDP経由でデータを受信する必要があるため、UDPリスニング用にこのコンポーネントクラス内にスレッドを作成しました。データが受信されると、2つの動作が20msの遅延でなければなりません。アクション1の後には常にアクション2を続ける必要があります。mutexを使用してスレッドとタイマーの経過イベントを制御する
私はタイマーとミューテックスインスタンスを作成しました。データを受け取った後、ミューテックスはロックされているため、アクション1は実行できませんが、アクション2は実行できません。タイマーが経過すると、イベントハンドラが呼び出され、2番目のアクションが処理され、ミューテックスが解放されます。それは理論上の計画です。
しかし、私はそれを解放しようとすると、ミューテックスがロックされていないというエラーが表示されます。
Imports System.Timers
Public Class CriticalActionProcessor
Private mTimer As System.Timers.Timer
Private mTimerMutex As Threading.Mutex
Private mReceiveThread As Threading.Thread
Public Sub New()
' do some initalizing
mReceiveThread = New Threading.Thread(AddressOf ProcessUDP)
mReceiveThread.IsBackground = True
mReceiveThread.Start()
mTimer = new Timer()
mTimerMutex = New Threading.Mutex()
AddHandler mTimer.Elapsed, Sub()
' do some things, that must happen after some time
mTimerMutex.ReleaseMutex() ' here it throws an exception
' because mutex is not locked
End Sub
End Sub
Private Sub ProcessUDP
Dim udpReceiver = New UdpClient(5668)
Dim ipEndPoint = New IPEndPoint(IPAddress.Any, 5668)
While (True)
Dim receivedData As Byte() = udpReceiver.Receive(ipEndPoint)
' check received data
mTimerMutex.WaitOne()
Fire()
End While
End Sub
Private Sub Fire()
' do some things and after that start timer
mTimer.Interval = 20
mTimer.Start()
End Sub
End Class
ミューテックスは、UDPスレッドとタイマースレッドで共有されていないようです。タイマー経過ハンドラが呼び出される前に、Fire()メソッドが2回目に呼び出されないようにするにはどうすればよいですか?
2つのスレッドを持つことができます.1つは、データを受信してキューに入れ、もう1つはキュー内のデータを処理します。 2つの動作の間に、タイマーの代わりに睡眠をとることができます。 –