16

シリアルポートsygnalのイベントを含むモジュールがあります

serialPort.DataReceived.AddHandler(SerialDataReceivedEventHandler(DataReceived));

DataReceivedは

let DataReceived a b =
    rxstring <- serialPort.ReadExisting()
    arrayRead <- System.Text.Encoding.UTF8.GetBytes(rxstring)
    if arrayRead.[0] = 0x0Auy then
        ProcessData(a, null)

ProcessDataはWinFormsメソッドを呼び出しています

let ProcessData(a, b) =
    dataProcessor.Invoke(a, b) |> ignore

これは

private void ProcessData(object sender, EventArgs e) {
   byte[] m = Core.ncon.ArrayRead;
   switch (m[1]) {
      case 0x01: {
          if (m.Length > 5) {
             int myval = BitConverter.ToInt32(m, 3);
             textBox1.Text += " val: " + myval.ToString() + " ";

しかし、textBox1にアクセスしようとすると、次のようになります。

クロススレッド操作が無効です:コントロール'textBox1'は、それが作成されたスレッド以外のスレッドからアクセスされました。

では、問題は、別のモジュールイベントからWinForm要素にアクセスする方法ですか?

4

2 に答える 2

29

フォームディスパッチャーを使用する必要があります。

FormContaingTheTextbox.Invoke(new MethodInvoker(delegate(){
    textBox1.Text += " val: " + myval.ToString() + " ";
}));

これにより、そのコードはあなたのコードではなくフォームスレッドで実行されます。

于 2012-10-11T10:23:43.560 に答える
18

以下のコードを使用してみてください:

this.Invoke(new MethodInvoker(delegate() 
{ 
//Access your controls
}));

お役に立てれば

于 2012-10-11T10:23:47.733 に答える