約2ヶ月ぶり。仕事が忙しくてなかなか遊べない。
今日はプログラムの話。
PC用としてはVBをメインに使っているわけだが、シリアルポートのDataRecievedって別スレッドなんだよな。
で、コントロール(TextBoxとか)に書き込もうとすると怒られる。
しかたなくDelegateなInvokeとかするわけだけど、長い。ほとんど使わないのに
なんで関数宣言とかしなきゃいけないんだ。ってことで色々試行錯誤してみた。
イベントを投げるやつは結局フォームに来てもスレッドが違うし、フォーム側でポーリングするのもいいけど
なんかやだし。
Imports System.Threading.Interlocked
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = "受信してないよ"
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
If SerialPort1.ReadByte = &HA Then
Me.Invoke(Function() Exchange(TextBox1.Text, "受信したよ"))
End If
End Sub
End Class
というわけでラムダ式とか使ってみた。だってVBで匿名メソッドってこれしか出来ないし。
匿名メソッドじゃないとDelegateで呼ぶ関数書かなきゃいけないし。
ってかなんでVBのラムダ式は返値必須なんだYO!おかげで時間かかったじゃないか!
でもこれって .NET Framework 3.5 なんだよな。業務で使ってるとどうしてもアップデートしてないのが多いから、2.0ですら新規が結構あったのに。。
2.0でやろうとすると
Me.Invoke(New Comparison(Of String)(Addressof Exchange), New Object(){TextBox1.Text, "Hoge"})
かな?ちょっと長くなったな。あれ?コンパイルできない。。返値の方が違ったorz
。。。
Private A As String = "受信してないよ"
Private Sub Timer1_Tick(ByVal sender As System.Object, yVal e As System.EventArgs) Handles Timer1.Tick
TextBox1.Text = A
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
If SerialPort1.ReadByte = &HA Then
A = "受信したよ"
End If
End Sub
ポーリングが一番楽な気がしてきた。。
[0回]
PR