1

ロードされると、USBデバイスから0.5秒ごとにデータを取得するループバックグラウンドワーカーを開始するフォームがあります。
プログラムは、USBデバイスから新しいデータを受信すると、関数を実行します。関数に
_Dowork

while (true)
{
    portConnection.Write("?");
    Thread.Sleep(50);
}

次に、データを受信したときに実行される別のルーチンがあります

private void portConnection_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
}

これは、関数が明らかに別のスレッドにあるため、元のフォームに値を設定できないルーチンです。
このルーチンを元のフォームに影響を与えるにはどうすればよいですか?

4

2 に答える 2

3

次のようなことを試してください:

private void InvokeIfRequired(Control target, Delegate methodToInvoke)
{
    if (target.InvokeRequired)
        target.Invoke(methodToInvoke);
    else
        methodToInvoke.DynamicInvoke();
}

メソッドを呼び出して、ProcessStatsReceived自分methodToInvokeのものを実行します...

ProcessStatusReceived で次のように使用できます。

InvokeIfRequired(this, new MethodInvoker(delegate() { this.lblStatus.Text = (string)e.Data; }));
于 2012-08-07T09:03:48.310 に答える
0

BackgroundWorker のレポート進行部分はそのために作られています。

これにより、DoWork メソッドが GUI スレッドでメソッドを呼び出せるようになります。

詳細については、このmsdn記事を参照してください。

要するに、必要な部品は次のとおりです。

進行状況が変更されたハンドラーをバインドします。

bw.ProgressChanged += bw_ProgressChanged;

進行状況レポートを許可するように BW を設定します。

bw.WorkerReportsProgress = true;

進捗変更メソッドを実装します。

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
  //your logic to be executed on the GUI thread here
}

次に、次のように DoWork から呼び出します。

bw.ReportProgress( progressPercentage, userState )

progressPercentageまた、バックグラウンド スレッドからGUI スレッドuserStateのメソッドにデータを転送することもできます。ProgressChanged

于 2012-08-07T08:55:29.263 に答える