2012-01-06 14 views
2

私が書いたプロジェクトにはプロセスがあります。時間がかかり、進行状況バーを使いたい。ボタンをクリックして、プロセスとProgressBarをキャンセルできるようにします。私は、プロセスが実行されているときに、ユーザーがそのフォームの他のコントロールをクリックできないようにしたい。スレッドを使用すると、ユーザーはフォーム上の他のコントロールをクリックできます。ボタンをクリックしてプロセスをキャンセルする

おそらく1つの解決策は別のフォームを使用し、2番目のフォームでProgressBarとキャンセルボタンを設定することです。しかし、どのようにしての最初のフォームに参加している私のプロセスに従ってProgressBarの値を設定することができますか?

解決策は何ですか?

ありがとうございます。

答えて

1

これにはBackgroundWorkerを使用してください。最初のフォームに追加し、BackgroundWorkerの進捗状況が変更されたイベントの変更進捗バーの値に追加します。ドキュメントに示されている例を見てください。

2

BackgroundWorkerを使用すると、進行状況とキャンセルを報告するためのAPIが提供されます。

2

これはダイアログを使用するのが最適です。自動的に残りのUIにアクセスできなくなります。プロジェクトに新しいフォームを追加し、ProgressBarとボタンをドロップします。そして、あなたはあなたのメインフォームのイベントハンドラからプログレスバーを更新できるようにパブリックメソッドを追加します。

public partial class ProgressDialog : Form { 
    public ProgressDialog() { 
     InitializeComponent(); 
    } 
    public void ShowProgress(int progress) { 
     progressBar1.Value = progress; 
    } 
    private void CancelProcess_Click(object sender, EventArgs e) { 
     this.DialogResult = DialogResult.Cancel; 
    } 
} 

をあなたは労働者を起動したときにダイアログを表示する必要があります:

ProgressDialog dlg; 

    private void RunProcess_Click(object sender, EventArgs e) { 
     backgroundWorker1.RunWorkerAsync(); 
     using (dlg = new ProgressDialog()) { 
      dlg.ShowDialog(this); 
     } 
     dlg = null; 
     if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync(); 
    } 

注意を作業者を停止させるためにCancelAsync()を呼び出す方法は、ダイアログを閉じることで止めることができます。

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { 
     dlg.ShowProgress(e.ProgressPercentage); 
    } 

そして、あなたは労働者が完了したときに自動的にダイアログを閉じるには、ユーザーがダイアログに自分自身を閉じていない必要があります:あなたは、プログレスバーを更新する必要があります

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
     if (dlg != null) dlg.Close(); 
    } 
私が書いたはずです
+0

その特別なプロセスのコードは?if(backgroundWorker1.IsBusy)backgroundWorker1.CancelAsync();という行の下にそれらを書きました。そのプロセスを実行した後、新しいフォームが有効にされ、何も表示されませんでした。この問題をどのように解決できますか? –

+0

バックグラウンドワーカーのDoWork()イベントハンドラに記述します。 –

+0

その問題は解決されましたが、別の問題が解決されました。そのプロセスでは、フォーム上にあるいくつかのコントロールにアクセスする必要があります。たとえば、opBという名前のボタンを無効にして、プロジェクトを実行するとcoltrols.このエラー:「クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスする 'opB'を制御します。私は今どうすればいい? –

関連する問題