1

バックグラウンド:

当社の製品には、システムに接続されたデバイスごとに専用アプリケーション (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 デスクトップのヒープ サイズを変更しようとしましたが、何の効果もありませんでした。

追加情報 (コード サンプル、コンパイル済みアプリ) が必要な場合は、お知らせください。

4

0 に答える 0