2011-12-11 13 views
2

私はファイルをコピーしているときにエクスプローラと同じように、私は非同期に実行できない長いプロセスを持っています。私は進捗ダイアログを持っています。ダイアログをモーダルに表示し、操作を実行して(ファイルをコピーして抽象的に保つ)、進行状況ダイアログを更新し、Application.DoEvents()でメッセージをポンピングして、アプリケーションのメインフレームをペイントして応答性にします。モーダル進捗ダイアログが表示されている間に "Application.DoEvents"を呼び出すことはできますか?

ダイアログはモーダルなので、ユーザーは監視またはキャンセル以外の操作はできません。つまり、メニュー項目を選択したり、任意のボタンをクリックすることはできません。

私はいつもあなたがリエントラントではないコードを再入力することができるので、Application.DoEventsは非常に悪いと考えています。しかしこの場合、進捗ダイアログはモーダルなので、これが悪いまたは危険な解決策である理由はわかりません。

私は何かを見落としているのですか、またはApplication.DoEventsでメッセージをポンピングしていますか、モーダルダイアログをアップするのが正当なのでしょうか?

+1

少なくともバックグラウンドスレッドで実行できないのはなぜですか?バックグラウンドワーカーを使用し、Control.BeginInvokeを使用してUIを更新してください。 – BFree

+1

[一部](http://stackoverflow.com/a/5183623/825024)[読み取り](http://stackoverflow.com/a/1115410/825024)。 – Otiel

答えて

0

DoEventsがこのように制限されていると、特に問題はありません。バックグラウンド処理がオプションではない場合、このような非常に限定された状況でうまく使用できます。

0

通常、アプリケーションのUIスレッドはメッセージを送信します。モーダルダイアログが独自のメッセージポンプを実行しても、単にモーダルダイアログを処理する必要はありません(たとえば、モーダルダイアログが閉じられたときにコールが戻るなど)。 (「古い新しいもの」ブログのthis blog postも参照してください)。

したがって、(UIスレッドで例えば、非協力的な処理)、それは通常、設計上の問題を示していても、実際にはどちらかApplication.DoEvents()を呼び出すための問題ではありませんし、それかもしれ原因リエントラントいくつかのウィンドウメッセージの場合とイベントハンドラはお互いをトリガしていますが、それはダイアログモダリティとは無関係です。

関連する問題