ボタンをクリックすると、メッセージがメッセージキューに投稿されます。次にメッセージキューをポンプするまで、それは処理されません。したがって、ボタンをクリックしてからプログラムが応答するまでに遅延が見られる場合は、メッセージキューがタイムリーに処理されていないためです。
GUIスレッドがビジー状態の場合、メインスレッドが実行している処理が終了するまで、メッセージキューはポンプされません。また、GUIスレッドで長時間実行するタスクがある場合、GUIスレッドはビジーになります。キューに入れられたボタンクリックメッセージが最終的に処理されると、を呼び出すとMessageBoxW
すぐにダイアログが表示されます。
GUIスレッドが実行されない他の唯一の理由は、CPUがより優先度の高いスレッドによって消費された場合です。しかし、それはほとんどあり得ません。アプリケーションが優先度の高いスレッドを使用することは非常にまれです。あなたがそうしているとしたら、私は驚きます。
問題を解決する方法は?メインスレッドで長時間実行されているタスクがある場合は、それらのタスクをバックグラウンドスレッドに移動します。または、GUIスレッドの実行を停止する優先度の高いスレッドがある場合は、バックグラウンドスレッドを通常の優先度で実行します。