2

これは、一部のコンポーネントの状態を設定するために Form2 で使用している小さなメソッドです。Load it ofcでForm2から呼び出すと。正常に動作しますが、Form1 から呼び出すと (いくつかの状態を更新する必要があります)、例外が発生します。

System.Windows.Forms.dll で、タイプ 'System.InvalidOperationException' の未処理の例外が発生しました

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

public void SetleMotor1()
{
    button1.Enabled = true;
    button2.Enabled = false;
    if (Form1.Motor1.Calibstate == 3)
        label4.Text = "Befejezve";
    else
        label5.Text = "Megállt";

    if (Form1.Motor1.Calibrated)
    {
        label21.Text = "Igen";
        label6.Text = Convert.ToString(Form1.Motor1.MMImp);
    }
    else
    {
        label21.Text = "Nem";
        label6.Text = "-";
    }
}

ここで何が欠けていますか?

Form2 のメソッドを呼び出す Form1 のコードを次に示します。

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // reading the data etc etc etc...then evaluating:
    case 1:
        if ((data[1] == 40) && (Motor1.Calibstate == 3))
        {
            long impulses = (65536 * data[2] + 256 * data[3] + data[4]);
            Form2.SetleMotor1(); // <----- this is where it happens
            Motor1.Calibstate = 0;
            zaloguj("A Motor 1 kalibrációja befejezve");
            if (Motor1.Debug)
                zaloguj("A Motor 1 köre " + Convert.ToString(impulses) + " impulzus");

            Motor1.MMImp = Convert.ToInt32(impulses / 360);
            Motor1.Calibrated = true;
            if (Motor1.Debug)
                zaloguj("M1Imp/deg: " + Convert.ToString(Motor1.MMImp));
        }
        break;
        // other similar code ...
}
4

1 に答える 1

7

フォームのスレッドでメソッド呼び出しを呼び出す必要があります。メソッドにそれ自体を実行させることができるので、呼び出しコードでそれについて心配する必要はありません。

public void SetleMotor1()
{
    if (Form1.InvokeRequired)
    {
        Form1.Invoke(new Action(SetleMotor1));
        return;
    }

    button1.Enabled = true;
    button2.Enabled = false;
    if (Form1.Motor1.Calibstate == 3)
        label4.Text = "Befejezve";
    else
        label5.Text = "Megállt";
    if (Form1.Motor1.Calibrated)
    {
        label21.Text = "Igen";
        label6.Text = Convert.ToString(Form1.Motor1.MMImp);
    }
    else
    {
        label21.Text = "Nem";
        label6.Text = "-";
    }
}
于 2013-08-28T22:46:32.837 に答える