私はマルチスレッドの Delphi 6 Pro アプリケーションを持っており、現在鋭意開発中です。メイン スレッド (VCL スレッド) のコンテキストで実行されるコードにブレークポイントを設定しても、問題はありません。ただし、他のスレッドのいずれかのコードでブレークポイントがトリガーされた場合、ブレークポイントからアプリケーションを続行した後、メイン スレッド (メイン フォームを含む) の VCL コンポーネントへのすべての再描画が行われなくなります。他のバックグラウンド コードが実行され続けているため、アプリケーションが死んでいるわけではなく、メイン スレッドだけです。Windows メッセージ ディスパッチャーが破損しているか、休止状態になっているようです。
このアプリケーションでは、登録された特定のメッセージをキャッチする必要があるため、メイン フォームの allocateHwnd() を介して独自の WndProc() を割り当てます。その WndProc() から、処理するカスタム メッセージをディスパッチし、現在のメッセージがコードで処理されない場合は、メイン フォームの継承された WndProc() を呼び出してメッセージを渡します。現在のメッセージを処理する場合は、メッセージが処理されたことをディスパッチャに伝えるために、Msg.Result を 1 に設定して WndProc() から返すだけです。独自の WndProc() を割り当てる代わりに、単に TForm WndProc() をオーバーライドすることはできません。何らかの理由で、Delphi VCL は Windows API の RegisterWindowMessage() 呼び出しでインスタンス化された登録済みメッセージを通過しないためです。
同様の状況でこれを経験した人はいますか? もしそうなら、それを修正するために何をしましたか?
-- ロシェル