C#

プログレスバー(ProgressBar)の完了と同時にダイアログを表示する方法

更新日:

実際の処理よりプログレスバーの動きが遅い

1.現象の確認

.NET Frameworkプログラム(VB.NET、C#)において、プログレスバー(System.Windows.Forms.ProgressBar)コンポーネントを使用し、経過ビジュアルでを表すことがよくある。
そして、処理が完了した時点で「完了メッセージダイアログ」を表示させたところ、プログレスバーが全て到達していないのに、先に「完了メッセージダイアログ」がでてしまうという現象がある。
下記のような現象である。

ずれている画面

 

これは実験的に作ってみた下記のような簡単なプログラムでも十分に確認することができる。

2.タイミングズレが起きる原因とその解決方法

Windows Vista以降では、アニメーション表示処理が実際のプログレスバーの画面描画の処理より遅れて実行されているため、処理が先に完了しても、描画がおいつかないことによってこのようなタイミングズレの現象が起きる。
解決対策としては、処理の間、ProgressBarのvalueプロパティーを実際の処理より1つUPした数値を代入し、直後に正しい値に代入しなおすだけである。
ただし、Max値を超えての代入はエラーとなるため、この場合は、強制的にMax値を増やし、同じ事を行う。
わかりにくいので下記をみていただければ...

こうして完成した結果がこれ

画面イメージ2-b

※因みにこんな実験をしてみたが全て結果はNGであった。

①プログラムが使用するCPUを限定してみた
使用しているPCには、CPUのコアが4つあるため、処理速度を遅くする。
→.NETでプログラムが使用するCPUの数を1つに限定する

②Windows任せの描画ではなく自分のプログラムから強制的に画面更新する
→Valueプロパティの更新直後に毎回 PostMessageで描画更新を呼びす

③Valueプロパティ更新後にわざと処理の遅延をかける。
System.Threading.Thread.Sleepで遅延をかけた

-C#

Copyright© プログラミングテクニック集キヤミー , 2020 All Rights Reserved.