バックグラウンド:
当社の製品には、システムに接続されたデバイスごとに専用アプリケーション (Win32 Delphi) のインスタンスが 1 つあります。最近、100 台以上のデバイスが接続された巨大なプロジェクトがあり、制御アプリケーションは 140 ~ 160 個の Win32 アプリケーションを開始しました。すべてのアプリケーションにはタイマーがあり、マウス カーソルがデスクトップを指すと、すべてのタイマーの動作が遅くなることがわかりました。
問題:
実験した結果、これはタイマーの問題ではなく、メッセージ ポンプの処理速度に問題があることがわかりました。
テスト:
3 つの異なるタイマーを持つテスト アプリケーションを作成しました: シンプルな Delphi TTimer (実際には内部の SetTimer/KillTimer)、コールバック ルーチンを呼び出すためのメッセージを使用する QueueTimer、および直接コールバック ルーチンを呼び出す QueueTimer。テスト アプリには、タイマー ティックが発生した時間を表示する 3 つのラベルもあります。すべてのタイマーは 20 ミリ秒ごとに刻み、10 刻み (=200 ミリ秒) ごとにテスト アプリが特定のタイマーのラベルを更新します。
110 を超えるアプリケーション (最小化) を開始すると、問題が発生し始めます。最小化された状態から1つのアプリを復元した後、マウスカーソルが任意のウィンドウ(テストアプリウィンドウ、タスクマネージャー、メモ帳、さらにはWindowsタスクバー)を指している場合、すべてのタイマーが期待どおりに動作することがわかります(確かにTTimerはそれほど正確ではありませんQueueTimer ですが、それでも許容範囲内です)。しかし、マウスカーソルがWindowsデスクトップ(デスクトップのショートカットを含む)を指すとすぐに、メッセージを使用するタイマーからのティックよりもはるかに遅くなることがわかります。直接コールバックを使用する QueueTimer のみが、同じ速度で刻み続けます。
質問:
このような Windows の「機能」を無効にする方法はありますか?
以下でテストおよび再現:
- W7 + Intel Xeon (4 コア) + NVidia (256MB RAM) + 16GB RAM,
- W10 + Intel Xeon (4 コア) + NVidia (256MB RAM) + 16GB RAM,
- W2016 サーバー + Intel 16 コア + 64GB RAM + AMD Radeon (1 GB RAM)。
すべてのウィンドウの視覚効果 (マウス ポインターの影など) がオフになっています。デスクトップの無地の背景でも発生します。
このウィンドウの動作を変更する方法がまったくわかりません。Windows デスクトップのヒープ サイズを変更しようとしましたが、何の効果もありませんでした。
追加情報 (コード サンプル、コンパイル済みアプリ) が必要な場合は、お知らせください。