2

2 つのオブジェクトがあります。ボタンとプログレス バーを備えた Windows フォームと、アルゴリズムを処理する別のオブジェクト。

アルゴリズム オブジェクトには、イベントとプロパティがあります。イベントはProgressChangedで、プロパティはProgress(int) です。

呼び出しウィンドウで、ボタンはアルゴリズム オブジェクトの一連のステップを開始します。各ステップ (またはサブステップ) が発生すると、ProgressChanged イベントが発生し、ウィンドウには、本質的に Progress プロパティに対して進行状況バーをインクリメントするイベント ハンドラーがあります。

私が直面している問題は、アルゴリズムが比較的長時間実行される可能性 (および高い可能性) があるため、アルゴリズムを独自のバックグラウンド スレッドに移動し、イベントをウィンドウにプッシュする必要があることです。

私の問題は、マルチスレッドに関して何をしているのか完全にはわからないということです。見ていControl.Invokeて、少し迷っています。

誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

3

バックグラウンドワーカーを使用します。Invoke を気にせずにプログレスバーを実行できる ReportProgress メソッド + イベントがあります。

于 2010-04-07T21:25:17.933 に答える
1

Invoke を使用して、安全にコントロールにアクセスできる UI スレッドに変更する方法の例を次に示します。

// In some form method, setup the event handler
algorithm.ProgressChanged += new EventHandler(AlgorithmProgressChanged);

private void AlgorithmProgressChanged(Object source, EventArgs args)
{
    if (this.InvokeRequired)
    {
        // Switch to the UI thread
        this.Invoke(new EventHandler(AlgorithmProgressChanged), source, args);
        return;
    }
    // It should be safe to set the progress beyond this point.
    progressBar.Value = algorithm.Progress;
}
于 2010-04-07T21:35:30.973 に答える
0

他のポスターが言うように、BackgroundWorker コンポーネントを使用します。説明とサンプル コード: http://ondotnet.com/pub/a/dotnet/2005/07/25/backgroundworker.html

-オイシン

于 2010-04-07T21:27:51.687 に答える