|
■No92753 (Hongliang さん) に返信
> このタイマの場合、Tickイベントは全て画面と同じスレッドで実行されます。
> なので、Timer1のTickイベント(の中で呼び出しているTestメソッド)が処理中の場合、Timer2のTickイベントはTimer1のTickイベントが終了するまで待たされることになります。
> // この挙動が、Itoさんが「別々の動作」と表現するものと一致しているかどうかは分かりませんが…。
⇒なるほど、納得しました。
分かりやすい説明有り難うございます。
> なお、画面と同じスレッドで動くという仕様上、Tickイベント内で秒単位の時間がかかるような処理を行うべきではありません。
⇒はい、それは心得てはいたのですが、サンプルとしたソースで検証出来るのではと思ったのと簡単にかけたため
タイマーイベントを使用しました。
で、実際の所RS232Cの通信で受信した時を処理するロジックにて疑問に思ったため
実際の処理に近いソースの提示が必要であることが分かったので以下に示します。(若干省略しております。)
Delegate Sub ExecCommandDelegater(ByVal pStr As List(Of Byte))
Private cmdDataAna1 As New List(Of Byte)
Private cmdDataAna2 As New List(Of Byte)
Private Sub Serial1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles Serial1.DataReceived
Dim wRDCnt As Integer = Serial1.BytesToRead
If wRDCnt < 1 Then
Exit Sub
End If
Dim wDT(wRDCnt) As Byte
Serial1.Read(wDT, 0, wRDCnt)
For i As Integer = 0 To wRDCnt - 1
If wDT(i) = &H2 Then 'コマンドの先頭
cmdDataAna1.Clear()
End If
cmdDataAna1.Add(wDT(i))
If wDT(i) = &H3 Then 'コマンドの終端
Invoke(New ExecCommandDelegater(AddressOf ExecCommand), cmdDataAna1)
End If
Next i
End Sub
Private Sub Serial2_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles Serial2.DataReceived
Dim wRDCnt As Integer = Serial2.BytesToRead
If wRDCnt < 1 Then
Exit Sub
End If
Dim wDT(wRDCnt) As Byte
Serial2.Read(wDT, 0, wRDCnt)
For i As Integer = 0 To wRDCnt - 1
If wDT(i) = &H2 Then 'コマンドの先頭
cmdDataAna2.Clear()
End If
cmdDataAna2.Add(wDT(i))
If wDT(i) = &H3 Then 'コマンドの終端
Invoke(New ExecCommandDelegater(AddressOf ExecCommand), cmdDataAna2)
End If
Next i
End Sub
Private Sub ExecCommand(ByVal pStr As List(Of Byte))
:
:
:
受信データの処理
:
:
:
End Sub
※現在はSerial2_DataReceived内のInvokeで定義している「ExecCommand」が「ExecCommand2」となっており
「ExecCommand」と「ExecCommand2」の内容はほぼ一緒です。
前任者がなぜこのようにしたのかは不明ですが(同時実行を回避するため??)これを上記の
ようにした場合問題があるかを知りたいです。
よろしくお願いします。
|