Application.ProcessMessages の呼び出しは、MSHTML の activeX コントロールがドキュメントの読み込みを完了する時間を確保するために必要な場合がほとんどです。バックグラウンドでのドキュメントの読み込みをシミュレートするために、ここで協調マルチタスクを使用しているようです.ActiveXは、次のチャンクなどを処理するためにメッセージを自分自身に投稿します.
通常、ドキュメントの読み込みは通常のメッセージ ループの一部として発生するため、これはアプリのフローには影響しません。しかし、ドキュメントを同期的にロードしたい (ドキュメントが完全にロードされるまで何もしない) ため、メッセージを介してバックグラウンドでロードする方法に敏感です。
解決策の 1 つ: ドキュメントを同期的にロードする要件を削除できるかどうかを確認してください。ロードが発生したときにロードを実行しますが、readState = complete のチェックを、おそらく 1 秒間隔でタイマーに移動します。タイマーがドキュメントの読み込みが完了したことを検出したら、下流の食物連鎖アクティビティを開始します。
別の解決策: ドキュメントが読み込まれるのを待っている間にモーダル ダイアログを表示します。これには、UI の残りの部分を無効にするという利点があるため、再入可能性のリスクを回避できます。ProcessMessages を呼び出すことは、ユーザーが引き続きウィンドウを操作したり、ボタンやメニューなどをクリックしたりできることを意味します。通常、これは問題を引き起こします。モーダル ダイアログ (「進行状況ダイアログ」) を表示すると、モーダル ダイアログの背後にあるすべてが無効になり、再入可能性が回避されます。
3 番目の可能性: Application.ProcessMessages を PeekMessage とロジックに置き換えて、メッセージを調べて、メッセージを通過させるか、後で使用するためにメッセージ キューに戻すかを決定します。これは少し汚れていますが、非常に特殊な場合に機能する可能性があります。
アプローチ 2 のモーダル ダイアログをお勧めします。