かなり長いプロセスの実行中に進捗メッセージを表示するフォームがあります。これはWebサービスの呼び出しであるため、進行状況バーに完全な割合の数字を有意義に表示することはできません。 (プログレスバーのマーキープロパティは特に好きではありません)
アニメーションGIFを表示して、プロセスに何らかのアクティビティ(Windowsコピープロセスなど、あるコンピューターから別のコンピューターに移動するファイル)の感覚を与えたいと思います。
これどうやってやるの?
同じ問題がありました。バックグラウンドでの長時間の操作により、フォーム全体(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の表示プロパティを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;
}