動作環境
C++ Builder XE4
以下のような処理をするソフトの修正をしている。
- TTimer処理
- 内部で
Application->ProcessMessage()
をコール
- 内部で
- 同じフォーム上の別の処理
- 特定の条件が成立したときに別フォームをモーダル表示
OSによって動作の違いが見られた。
Windows 7
TTimer処理のApplication->ProcessMessage()
の次の処理に戻ってくる。
Windows 8.1, Windows 10
TTimer処理のApplication->ProcessMessage()
で処理が止まる。
モーダル表示のフォームがクローズされるまで処理停止状態。
対応方法
TTimerなどの「すぐに抜けるべき処理」においてApplication->ProcessMessage()
を使わない。
前任者がなぜそこに「Application->ProcessMessage()」を入れたかは不明であるが、TTimer処理内で入れるべきではないと考えている。
修正後のソフトをWindows 7/8.1/10にて動作確認した。
Windows 7で問題がなかったのは、たまたまなのか。Windows 8.1以降で内部処理が変わったのかは未消化。