忍者ブログ

[PR]東裏通

別スレッドからのコントロールへのアクセス東裏通


[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

別スレッドからのコントロールへのアクセス

約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

Comment

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード

Trackback

この記事のトラックバックURL:

プラグイン

カレンダー

04 2025/05 06
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリー

最新記事

最新CM

最新TB

プロフィール

HN:
東こうじ
性別:
男性

リンク

サイトマスター

アクセス解析

バーコード

RSS

ブログ内検索

アーカイブ

カウンター