2

非同期に実行できない長いプロセスがあるため、ファイルをコピーするときのエクスプローラーと同じように、進行状況ダイアログが表示されます。ダイアログをモーダルに表示し、操作を実行し (抽象化するためにファイルのコピーと呼びます)、進行状況ダイアログを更新し、Application.DoEvents() でメッセージを送り込んで、アプリケーションのメイン フレームのペイントと応答性を維持します。

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

私は常に、Application.DoEvents は非常に邪悪であると信じてきました。再入可能にするつもりのないコードを再入力できるからです。しかし、この場合、進行状況ダイアログはモーダルであるため、これが悪いまたは危険な解決策である理由がわかりません。

私は何かを見落としていますか、それとも Application.DoEvents を使用してメッセージを送り込むことは、モーダル ダイアログを使用する正当な行為ですか?

4

2 に答える 2

0

通常、アプリケーションのUIスレッドはメッセージを送ります。モーダルダイアログが独自のメッセージポンプを実行している場合でも、これは単に呼び出しの動作を期待どおりに維持するためです(たとえば、呼び出しはモーダルダイアログが閉じられたときにのみ返されます)が、モーダルダイアログ自体を処理する必要はありません。(「古い新しいもの」ブログからのこのブログ投稿も参照してください)。

Application.DoEvents()したがって、通常は設計上の問題(UIスレッドでの非協調処理など)が表示され、一部のウィンドウメッセージとイベントハンドラーが相互にトリガーしている場合は再入可能になる可能性がありますが、どちらを呼び出すことも実際には問題ではありません-しかし、それはダイアログモダリティとは無関係です。

于 2011-12-11T01:39:44.817 に答える
0

このように DoEvents を限定的に使用しても特に問題はないと思います。バックグラウンド処理がオプションでない場合、このような非常に限られた状況でうまく使用できます。

于 2011-12-11T01:28:02.930 に答える