3

長時間の操作(ファイルの処理など)をループしていて、プログレスバーを更新したい場合は、理解できることから、DoEventsを使用する必要があります。

ただし、関数のすべてのループ中に呼び出すと、プログレスバーのアニメーションが非常に速く(または操作によっては遅く)再生されるだけです。これは、DoEventsを使用すると、プログレスバーが「呼吸」できるため、より適切な単語が不足しているため、プログレスバーとフォームの残りの部分が更新されるためです。

私の質問は、DoEventsを呼び出すことが適切であることをどのように知っていますか?明らかに、気まぐれでそれを呼び出すことはできません-しばしばあなたはそれのように感じます-これはとりわけ散発的なアニメーションをもたらします。では、フォーム/アプリケーションにDoEventsの呼び出しが必要かどうかを確認する簡単な方法はありますか?

4

3 に答える 3

8

ああ、当たり前-私はただ自分を叩いた。

処理にはバックグラウンドスレッドを使用し、UIスレッドはそのままにしておく必要があります。

于 2010-11-07T23:00:26.190 に答える
1

スレッドをいじくり回す代わりに、 BackgroundWorkerを使用できます。UI以外のスレッドから直接UIコントロールを更新することはできないため、フォームでの作業の実行とコントロールの更新が簡単になります。ドキュメントの例では、Labelコントロールを更新していますが、ProgressBarを使用するように簡単に変更できます。

于 2010-11-08T01:35:39.147 に答える
1

スレッドをいじりたくなく、少しベータテストをしてもかまわない場合は、Visual Studio AsyncCTPを一見の価値があります。基本的には「DoEventsは正しい方法で実行されます」(およびそれ以上)です。

これらの新しい非同期機能の概要については、EricLippertのブログを確認することをお勧めします。

于 2010-11-07T23:14:52.723 に答える