1

WinFormsでのスレッド化の経験はほとんどありません。プログレスバーを100に設定し、2秒間スリープしてから、プログレスバーを非表示にしようとしています。

私は持っています:

public void ProgressBarTimerStop()
{
    if (!AnyWorkersBusy())
    {
        if (InvokeRequired)
        {
            Invoke((MethodInvoker)delegate
            {
                ProgressBarTimer.Stop();
                Thread.Sleep(1000);
                Application.DoEvents();
                Thread.Sleep(1000);
                StatusToolStripProgressBar.Visible = false;
                StatusToolStripProgressBar.Value = StatusToolStripProgressBar.Minimum;
            });
        }
        else
        {
            ProgressBarTimer.Stop();
            StatusToolStripProgressBar.Value = StatusToolStripProgressBar.Maximum;
            Thread.Sleep(1000);
            Application.DoEvents();
            Thread.Sleep(1000);
            StatusToolStripProgressBar.Visible = false;
            StatusToolStripProgressBar.Value = StatusToolStripProgressBar.Minimum;
        }
    }
}

私が経験している現在の問題では、InvokeRequiredはfalseです。

私が電話をかけるとき:

StatusToolStripProgressBar.Value = StatusToolStripProgressBar.Maximum;

ウォッチウィンドウに設定された値が表示されますが、これを反映するようにGUIが更新されていません。すぐに2秒間スリープすると、スリープする前にGUIが更新されません。

事前にsleepを呼び出さずにApplication.DoEvents()を呼び出すと、何もしないように見えます。

スリープ状態の場合は、DoEvents(GUIの更新)を呼び出してから、スリープ状態に戻ります。これは正しいですが、私のコードは凶悪なように感じます。

ここで重要な概念を誤解していますか?

編集:ProgressBarTimerStopは、「RunWorkerCompleted」イベントハンドラーを介してのみ呼び出されます。

これを試しましたが、効果がありませんでした。

StatusToolStripProgressBar.GetCurrentParent().Refresh();
4

2 に答える 2

1

あなたが見逃している「重要な概念」は、プログレスバーの値を更新しても、プログレスバーにそれ自体を再描画するようにすぐに指示しないということです。

進行状況バーを更新すると、GUI スレッドは次のウィンドウの再描画時に進行状況バーを再描画します。これは、GUI スレッドが自由になったときにのみ発生します。通常、これは、ウィンドウがオペレーティング システムからペイント メッセージを受信したときに発生します。これは によって取得されるはずですがApplication.DoEvents、メッセージが によって取得されるほど迅速にキューに入れられていない可能性がありますDoEvents。通話で強制できる場合がありRefreshます。

于 2012-06-07T23:38:38.070 に答える
0

StatusToolStripProgressBar.ProgressBar.Refresh();すべてのステップで呼び出します。ProgressBarのプロパティToolStripProgressBarが非表示になっているため、IntelliSense リストに表示されない場合があります。

于 2012-11-21T12:05:44.803 に答える