私はこのようなコードを持っています:
private void testToolStripMenuItem_Click(object sender, EventArgs e)
{
toolStripStatusLabel1.Text = " Device Testing...";
positive = false;
clearsensors_gui();
datarec = false;
cmd = 04;
datarec = serialport_FT(0, 1);
if (datarec)
{
char ab = Convert.ToChar(rec_data[1]);
//MessageBox.Show("\n" + ab + "\n");
int cab = Convert.ToInt16(ab);
int cabc1 = cab & 1;
int cabc2 = cab & 2;
int cabc3 = cab & 4;
int cabc4 = cab & 8;
int cabc5 = cab & 16;
int cabc6 = cab & 32;
if (cabc1 == 1)
ovalShape1.FillColor = Color.Green;
else
ovalShape1.FillColor = Color.Red;
if (cabc2 == 2)
ovalShape2.FillColor = Color.Green;
else
ovalShape2.FillColor = Color.Red;
if (cabc3 == 4)
ovalShape3.FillColor = Color.Green;
else
ovalShape3.FillColor = Color.Red;
if (cabc4 == 8)
ovalShape4.FillColor = Color.Green;
else
ovalShape4.FillColor = Color.Red;
if (cabc5 == 16)
ovalShape5.FillColor = Color.Green;
else
ovalShape5.FillColor = Color.Red;
if (cabc6 == 32)
ovalShape6.FillColor = Color.Green;
else
ovalShape6.FillColor = Color.Red;
toolStripStatusLabel1.Text = " Device Tested";
}
else
{
toolStripStatusLabel1.Text = "Try Again or Communication With Device Failure....";
}
}
上記のコードは、センサーを読み取るためのものです。つまり、datarec = serialport_FT(0、1); 関数は、GUI側でセンサー出力を提供します。これは、後でred \ green ovalShapeX(1-6)で示されます。
質問:datarec = serialport_FT(0, 1);
この関数はliltimeを使用するため、GUIはその時間までフリーズします。これを回避するにはどうすればよいですか?
バックグラウンドワーカーを使用しようとしましたが、このプロセス全体を配置する場所がわかりませんでした。また、ovalShapeに移動してそのプロパティを変更すると、クロススレッド操作エラーが発生しました。
関数のどの部分をバックグラウンドで使用するのか、いつどこで1番目のスレッドに戻るのかがわかりません。
スレッドを使用する必要がある場合は、backgroundworkerを使用するか、invokeを使用するのを手伝ってください