2009-03-08 8 views
2

私のmdi VB.Netアプリケーションは、一部のデータに対して長い操作を実行します。理想的には、私は恐ろしい "応答していません"というメッセージを防ぐために別のスレッドを使うべきです。.Net Not Responding、Application.DoEvents and threading

別のスレッドを使用すると、アプリケーション内の他のコントロールをクリックしてバックグラウンドスレッドの操作に直接影響を与え、エラーが発生することがあります。

バックグラウンドスレッドの操作中にすべてのmdiウィンドウ、ツールバー、および他のコントロールがマウスクリックやキーボード入力を受け取らないようにする方法はありますか?

また、Application.DoEventsを実行する前にメッセージキューをクリアする方法はありますか?

おかげ

答えて

4

私は、ユーザーがコントロールをクリックしたくない最良の選択は、その制御のためにFalseに設定することが有効であると言うでしょう。

CLARIFICATION:親コントロールでEnabledをFalseに設定すると、子が無効になります。したがって、メインウィンドウとMDIウィンドウでEnabledをFalseに設定すると、そのトリックが実行されます。

+0

はいいくつかのmdiウィンドウの問題は、多くのコントロール、ツールバー、ectなどがあります。電源を切るために。それはできますが、もっと広い解決策を望んでいました。 – user32183

+0

親コントロールでEnabledをFalseに設定すると、子が無効になります。したがって、メインウィンドウと各MDIウィンドウでEnabledをfalseに設定すると、このトリックが実行されます。 –

+0

私はそれを忘れてしまった。それが助けになるだろう。ありがとう – user32183

2

コントロールを無効にするにはいくつかの方法がありますが、わたしはそれがあなたが望むものではないと確信しています。

バックグラウンドスレッドが処理中に完全に無効になっているメインウィンドウを持っている場合、バックグラウンドで処理するオーバーヘッドはなぜ発生しますか?バックグラウンドで処理する利点は、ユーザーがデータを処理している間もアプリケーションで作業できるようにすることです。

ダスティンのルートを利用し、バックグラウンド操作に影響する特定のコントロールを選択的に無効にする方がよいと思います。または、処理中にUIから独立したバックグラウンド操作を行います。

メインウィンドウとバックグラウンドスレッドがどのようにやりとりするかについて少しお話していただければ、より良い解決策をご提供できるかもしれません。

0

すべてのフォームを非表示にして、1つのメインフォームのみを表示します。その後、ツールバー/メニューがある場合は無効にします。その後、進行状況バーが表示されたステータスバーが表示され、完了したらユーザーが作業していたフォームを再表示します。

0

バックグラウンドスレッドが長時間の作業を処理しているときにステータスバーまたはプログレスバーを使用している場合は、フォームを無効にすると進行状況/ステータスバーの更新が無効になります。ですから、この場合は、アクティブにしておく必要のある他のコントロール(たとえばプログレスバーのようなもの)を無効にする必要があります。

List<Control> lstControls = GetAllControls(this.Controls); 

       foreach (Control ctrl in lstControls) 
       { 
       if (ctrl.GetType().Name.ToLower().Contains("progressbar")      { 
         ctrl.Enabled = true; 
        } 
        else 
        { 
         ctrl.Enabled = false; 
        } 
       } 
0

糸を使用し、ユーザーにタスクの進捗状況を表示し、ユーザーにそれをキャンセルするオプションを提供しますモーダルダイアログを表示します。自動的に入力防ぐことができます

モーダルダイアログ(親は、MDIウィンドウ自体する必要があります。)

(、、してくださいしてくださいしてください隠しまたはコントロールやウィンドウを無効にする。などハックを使用しないでください!やりますDoEventsを使用しないでください。)