かなり長いプロセスの実行中に進行状況メッセージを表示するフォームがあります。これは Web サービスの呼び出しであるため、進行状況バーに完了率を意味のある形で表示することはできません。(プログレスバーの Marquee プロパティは特に好きではありません)
アニメーション GIF を表示して、プロセスにアクティビティの感触を与えたいと思います (たとえば、Windows のコピー プロセスのように、あるコンピューターから別のコンピューターに移動するファイル)。
これどうやってやるの?
かなり長いプロセスの実行中に進行状況メッセージを表示するフォームがあります。これは Web サービスの呼び出しであるため、進行状況バーに完了率を意味のある形で表示することはできません。(プログレスバーの Marquee プロパティは特に好きではありません)
アニメーション GIF を表示して、プロセスにアクティビティの感触を与えたいと思います (たとえば、Windows のコピー プロセスのように、あるコンピューターから別のコンピューターに移動するファイル)。
これどうやってやるの?
それほど難しくありません。
考慮事項:
アニメーション GIF:
アニメーション GIF を探している場合は、それらを生成できます。
AjaxLoad - Ajax ローディング GIF ジェネレーター
それを行う別の方法:
非常にうまく機能することがわかった別の方法は、コード プロジェクトで見つけた非同期ダイアログ コントロールです。
私も同じ問題を抱えていました。バックグラウンドで長時間動作しているため、フォーム全体 (gif を含む) の再描画が停止します。これが私がこれを解決した方法です。
private void MyThreadRoutine()
{
this.Invoke(this.ShowProgressGifDelegate);
//your long running process
System.Threading.Thread.Sleep(5000);
this.Invoke(this.HideProgressGifDelegate);
}
private void button1_Click(object sender, EventArgs e)
{
ThreadStart myThreadStart = new ThreadStart(MyThreadRoutine);
Thread myThread = new Thread(myThreadStart);
myThread.Start();
}
この操作を担当する別のスレッドを作成しただけです。この初期フォームのおかげで、問題なく再描画が続行されます (私の gif の動作を含む)。ShowProgressGifDelegate と HideProgressGifDelegate は、gif を含む pictureBox の visible プロパティを true/false に設定する形式のデリゲートです。
Windows では、伝統的にアニメーション GIF を使用せず、AVI アニメーションをほとんど使用しないことに注意してください。それらを表示するためだけの Windows ネイティブ コントロールがあります。アニメーション GIF を AVI に (およびその逆に) 変換するツールもあります。
PictureBox コントロールに配置すると、動作するはずです。
同じスレッドにいるため、すべてが停止するため、長い操作を開始するときはそうではありません。
私は同じ問題を抱えていて、以前はいくつかの異なる問題に直面していた実装によって、さまざまな解決策に出くわしました。最後に、以下は、期待どおりに機能するさまざまな投稿の一部をまとめたものです。
private void btnCompare_Click(object sender, EventArgs e)
{
ThreadStart threadStart = new ThreadStart(Execution);
Thread thread = new Thread(threadStart);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
PictureBox コントロールの呼び出しも実行する Execution メソッドを次に示します。
private void Execution()
{
btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = true; });
Application.DoEvents();
// Your main code comes here . . .
btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = false; });
}
PictureBox は [プロパティ] ウィンドウからは見えないことに注意してください。または、以下を実行してください。
private void ComparerForm_Load(object sender, EventArgs e)
{
pictureBox1.Visible = false;
}