1

背景:

我们的产品为连接到我们系统的每个设备都有一个专用应用程序 (Win32 Delphi) 实例。最近我们有一个巨大的项目,连接了超过 100 台设备,所以我们的控制应用程序启动了 140-160 个 Win32 应用程序。每个应用程序都有它的计时器,我们已经看到,当鼠标光标指向桌面时,所有计时器的滴答声都会变慢。

问题:

实验后发现,不是定时器问题,而是消息泵处理速度的问题。

测试:

我创建了测试应用程序,它有 3 个不同的计时器:简单的 Delphi TTimer(实际上是 SetTimer/KillTimer 内部),使用消息调用回调例程的 QueueTimer,以及调用直接回调例程的 QueueTimer。测试应用程序还有 3 个标签来显示计时器滴答发生的时间。所有计时器每 20 毫秒计时一次,每 10 次计时 (=200 毫秒) 测试应用程序刷新特定计时器的标签。

当我启动超过 110 个应用程序(最小化)时,问题开始发生。从最小化状态恢复一个应用程序后,我可以看到,如果鼠标光标指向任何窗口(测试应用程序窗口、任务管理器、记事本,甚至 Windows 任务栏) - 那么所有计时器都按预期滴答(当然 TTimer 并不像QueueTimer,但仍在可接受的范围内)。但是,只要鼠标光标指向 Windows 桌面(包括桌面中的任何快捷方式),我就会看到,使用消息的计时器比使用消息的滴答声要慢得多。只有使用直接回调的 QueueTimer 继续以相同的速度滴答作响。

问题:

有什么办法可以禁用 Windows 的这种“功能”?

测试和复制:

  • W7 + 英特尔至强(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 视觉效果(如鼠标指针阴影等)都关闭,桌面纯色背景也会发生这种情况。

我真的不知道如何改变这个窗口行为。我试图更改 Windows 桌面堆大小而没有任何效果。

如果需要一些额外的信息(代码示例、编译的应用程序) - 请告诉我。

4

0 回答 0