1

重複の可能性
: 「クロススレッド操作が無効です: 作成されたスレッド以外のスレッドからアクセスされた lbFolders を制御します。」というエラーが表示されるのはなぜですか?
ウィンドウ ハンドルが作成されるまで、Invoke または BeginInvoke をコントロールで呼び出すことはできません

スレッドに問題があります。

COM ポートから 600 ミリ秒ごとにデータを取得しています。デバッグ モードでは数秒後にエラーが発生しますが、非デバッグ実行モードでは 1 ~ 2 分後にエラーが発生しますが、エラーは持続します。

私が得ているエラーは、各スレッドで呼び出される関数の一部で発生しています。

エラーの写真は次のとおりです。

エラー

コードの他の部分:

private void LoadData()
        {
            while (td.IsAlive)
            {
                eng.GetSpeedKmh();
                eng.GetEngineRpm();
                eng.GetCalculatedEngineLoadValue();
                eng.GetFuelLevelInput();
                eng.GetEngineTemp();
                eng.MAF();

                System.Threading.Thread.Sleep(600);
            }
        }

これを修正するにはどうすればよいですか?

4

2 に答える 2

2

以下のコードを試してください

public void eng_OnGetSpeedDone(OBDIIEngineEventArgs args)
        {
            if (this.InvokeRequired)
            {
                Action action = () => eng_OnGetSpeedDone(args);
                Invoke(action);
                return;
            }
            if (!args.OBDResultNoData)
                brzina_ele.Text = arg.OBDValue.ToString();
            else
                brzina_ele.Text = "0";

        }
于 2012-08-28T12:27:49.533 に答える
-1

.Text プロパティの編集を呼び出します。

this.Invoke((MethodInvoker) delegate { brzina_ele.Text = "Its new value"; });

Tick イベントを使用して、Windows.Forms.Timer からの呼び出しを行うこともできます。これはよりスレッドセーフであり、必要なものがすべて揃っています。

于 2012-08-28T11:46:46.333 に答える