• 締切済み

C#のフォームについて

http://dobon.net/vb/dotnet/programing/progressdialog.html 上記のサイトを元にプログラムを作成したのですがうまくいきません。 ProgressDialog pd = new ProgressDialog(); //ダイアログのタイトルを設定 pd.Title = "カウントアップ"; //プログレスバーの最小値を設定 pd.Minimum = 0; //プログレスバーの最大値を設定 pd.Maximum = 10; //プログレスバーの初期値を設定 pd.Value = 0; //進行状況ダイアログを表示する pd.Show(this); //処理を開始 for (int i = 1; i <= 10; i++) { //プログレスバーの値を変更する pd.Value = i; //メッセージを変更する pd.Message = i.ToString() + "番目を処理中..."; //キャンセルされた時はループを抜ける if (pd.Canceled) break; //時間のかかる処理 //時間のかかる処理 //時間のかかる処理 } //ダイアログを閉じる pd.Close(); 上記のコードの場合、ループ毎の最初にキャンセルかどうかの条件が書かれているため、ループ処理の途中にキャンセルを押してもきかない時があります。 処理中は常にキャンセルかを監視し、押されたらすぐにキャンセルできるようにしたいのですが、どのようにしたらいいのでしょうか。

みんなの回答

回答No.2

該当サイトの一番上の注意書きにあるとおり,現在の.NET環境であればBackgroundWorkerを使うように修正してください。 http://dobon.net/vb/dotnet/programing/progressdialogbw.html キャンセルを確認するのはワーカー側の責務です。 というのは,安全に処理を中断するタイミングで中断を開始しないと, データが壊れる等の問題が起きる可能性があり, それを判断できるのは処理を実行しているワーカー側だけだからです。 キャンセルの確認の回数を増やせば,処理中断までの時間は短くなります。 どの程度の時間を許容できるかによって,キャンセルの確認回数を増やすことになるかと想います。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

途中で中断しても問題ないような処理であれば…… //処理を開始 for (int i = 1; i <= 10; i++) {  //プログレスバーの値を変更する  pd.Value = i;  //メッセージを変更する  pd.Message = i.ToString() + "番目を処理中...";  //キャンセルされた時はループを抜ける  if (pd.Canceled)   break;  //時間のかかる処理  //キャンセルされた時はループを抜ける  if (pd.Canceled)   break;  //時間のかかる処理  //キャンセルされた時はループを抜ける  if (pd.Canceled)   break;  //時間のかかる処理 } というように、都度都度チェックするしかないかと思われます。 # それでも判定されるタイミングは「//時間のかかる処理」の処理内容次第ということになりますけど。