簡単な実行中ウィンドウ(その2)
http://blogs.wankuma.com/rti/archive/2007/02/07/61401.aspx
上記(昨日)の話です。
裏方作業
というオブジェクト名は、かなり気に入っています。
などと書いたところ、えムナウさんに「FormにBackgroundWorkerコンポーネントを貼り付けないなんて気に入らない。 」という見事な返しをいただきまして(w)、フォームオブジェクト1本にまとめることにしました。
デザイナが partial なクラスを作ってくれるため、その部分を記述する必要は当然の如くありません。
private void 簡単な実行中ウィンドウ3_Load(object sender, EventArgs e) {
private void 裏方作業_DoWork(object sender, DoWorkEventArgs e) {
private void 裏方作業_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
private void 裏方作業_ProgressChanged(object sender, ProgressChangedEventArgs e) {
の各イベントは、忘れずに登録して下さい。
それと、WorkerReportsProgress プロパティも true にして下さい。
昨日の、Running フォームのプロパティもデザイナで指定するればコードの記述は不要なので、これも除外します。
BackgroundWorker のオブジェクト名は、昨日と同じ「裏方作業」です。
using System.Windows.Forms;
using System.ComponentModel;
public partial class 簡単な実行中ウィンドウ3 : Form
{
public 簡単な実行中ウィンドウ3() {
this.InitializeComponent();
}
public void 重たい処理を開始する() {
this.ShowDialog(); // ここが昨日と違うところですよ。
}
private void 重たい処理本体() {
for (int i = 0; i < int.MaxValue; ++i) {
// 裏方作業具合を報告(裏方作業_ProgressChanged を呼び出す)
裏方作業.ReportProgress(i);
}
// この処理が終わったら、裏方作業_RunWorkerCompletedが
// 呼び出される。
}
private void 簡単な実行中ウィンドウ3_Load(object sender, EventArgs e) {
// 裏方作業開始(裏方作業_DoWork を呼び出す)
this.裏方作業.RunWorkerAsync();
}
private void 裏方作業_DoWork(object sender, DoWorkEventArgs e) {
// 裏方作業で重たい処理を実行する。
this.重たい処理本体();
}
private void 裏方作業_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
this.Close(); // 裏方作業が終わったので実行中を閉じる。
}
private void 裏方作業_ProgressChanged(object sender, ProgressChangedEventArgs e) {
// 進捗度を取得します。
// プログレスバーやラベルに設定して下さい。
int i = e.ProgressPercentage;
}
}
かなりすっきりしましたね。
重たい処理を実行中のフォームと一本化して、デザイナを上手に使えば、たったこれだけのコードを書くことで実行中画面を表示するスレッドと、実際に重たい処理を実行するスレッドを同時に実行できる訳です。
マルチスレッドが、こんなに簡単に実装できるようになったなんて素晴らしい。
この手法は今後よく使うことになりそうです。
* 上記コードは、コメントをいただいた後に修正しました。