大量のデータを処理していて、最小化するとフォームが白くなりますが、ファイルの処理が完了すると元のフォームに戻ります。
元:
これは、フォームを最小化したときに起こったことです。
これは、大量のデータを処理した後に起こったことです。元の形式に戻ります。
私がやりたいのは、フォームを最小化しても、フォームが白くならず、ファイルの処理の進行状況に何が起こっているかを示すことだけです。
Visual Studio 2008とC#言語を使用しています。
大量のデータを処理していて、最小化するとフォームが白くなりますが、ファイルの処理が完了すると元のフォームに戻ります。
元:
これは、フォームを最小化したときに起こったことです。
これは、大量のデータを処理した後に起こったことです。元の形式に戻ります。
私がやりたいのは、フォームを最小化しても、フォームが白くならず、ファイルの処理の進行状況に何が起こっているかを示すことだけです。
Visual Studio 2008とC#言語を使用しています。
Massimilianoの回答が示すように、白いウィンドウの理由は、UIスレッドで処理を実行しているためです。何かをするのに忙しいので(ファイルの見た目でファイルを暗号化する)、スレッドはウィンドウを自由に描くことができません。
バックグラウンドスレッドで処理を行う方法の良い例については、BackgroundWorkerクラスを調べてください。上記のリンクのページの約半分に例があります。
これは、マルチスレッドを使用する必要がある典型的な例です
以下をご覧ください。
http://visualstudiomagazine.com/articles/2010/11/18/multithreading-in-winforms.aspx
ここで処理しているものを教えていないので、ここにサンプルがあります
//this starts the new thread
Task.Factory.StartNew( () =>
{
//do you stuff here, I added a windows directory file search
DirectoryInfo dir = new DirectoryInfo(@"c:\");
//searches for all files on your computer, it will run for a while, stops after it finds 200
foreach(var file in dir.EnumerateFiles("*" + textBox1.Text + "*.doc?", SearchOption.AllDirectories).Take(200))
{
this.BeginInvoke( new Action(() =>
{
//this sends information back to the main ui thread it can be any method at all
Files.Add(file);
}));
}
});
長時間実行されている作業をバックグラウンドスレッド(またはワーカースレッド)で実行して、UIスレッドがユーザーに応答できるようにします。長時間実行されている作業の実行中にUIスレッドがブロックされるため、「白」が表示されます。
あなたがグーグルで回っているならたくさんの例があります、ここに例があります。
最も洗練された解決策は、おそらく別のスレッドで長いプロセスを実行させることです。これを行う場合は、ユーザーインターフェイスを一時的に無効にするようにしてください(おそらく、小さな進行状況画面をモーダルに表示することによって)。クリス・シャインが示唆したように、バックグラウンドワーカーはおそらく行く方法です。
可能な限り短い答えを探していて、[en | de]暗号化アルゴリズムの進行状況イベントにアクセスできる場合は、定期的にform.Refresh()を呼び出して画面を再描画できます。
BackgroundWworkerは、マルチスレッドの一種です。直接スレッドを使用するよりも少し簡単だと思います。
作業中は、暗号化または復号化するときです。そして、DoWorkEventArgs eで引数(ファイルおよび暗号化モード)を渡します。RunWorkerCompletedでは、完了したメッセージを表示できます。または、完成したファイルのListViewを用意します。暗号化/復号化が機能している間は、暗号化モードを終了してファイルをホットに開くこともできます。次に、RunWorkerCompletedで、[EncyptandDecrypt]ボタンを有効にします。
アプリケーションがUIスレッドを計算するまで、メッセージは処理されないため、からの白があります。
それを解決するには2つの方法があります。
すべての計算を別のスレッドに移動します。
計算コードからApplication.DoEvents()を呼び出します。これは悪い習慣ですが、機能します
マルチスレッドの例:
private void ButtonClick(...)
{
((Action)Calculation).BeginInvoke(null, null);
}
private void Calculation()
{
your calculations here
}
Windowsフォームでは、BackgroundWorkerを使用してバックグラウンドで作業し、UIスレッドを停止しないでください。