【问题标题】:Delphi Application Z Order and windows ghosting featureDelphi Application Z Order 和 windows 重影功能
【发布时间】:2015-10-15 02:45:32
【问题描述】:

为了演示这个问题,我创建了一个包含 4 个空白表单的简单应用程序。其中一个(Form1)是主要的并自动显示。显示我在代码项目中放入的其他表格:

…
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Form2.Show;
  Form3.Show;
  Form4.Show;
  Application.Run;
end.

在第二个表单(或任何其他表单)Form2 上,我放置了一个按钮,当单击该按钮时,同步执行长(>5 秒)SQL 查询(任何,我打开存储过程)。是不是同步的,也就是app至少挂了10秒。这时候会触发windows重影。 Windows 为您可以最小化、移动和关闭的所有 Windows 陈旧应用程序创建 Windows Ghost。执行查询后,应用程序继续处理消息,一切都恢复到原来的状态。

一定是这样,但对我来说不是。事实上,解冻程序Windows的Z-order改变后,Windows的顺序是混杂的。此外,顶部(或底部)可以脱离任何窗口,我没有注意到任何模式。在取消重影时,Windows 似乎没有正确恢复 Z 顺序。

在 Delphi 2007 中也发现了这种行为。请注意,在 Delphi 调试器模式下重影被禁用,您不会看到这种行为。在没有调试器的情况下运行应用程序以查看此行为。 使用 DisableProcessWindowsGhosting 禁用模式重影后 - 一切正常。

但我不想完全禁用此模式,程序经常挂起超过 5 秒,并且此模式很有用:用户仍然可以更好地查看以某种方式重绘的 Windows,而不是根本不重绘。为异步执行查询重写一半的程序代码是一个非常耗时且耗时的任务,我们恐怕没有足够的资源,尽管这无疑是正确的做法。

MainFormOnTaskBar 属性与我的问题无关,delphi 7 中没有这样的属性。

这会影响除我之外的其他人吗?如果不是——我哪里做错了?如何强制 Windows 正确重构 Windows 的序列?

【问题讨论】:

标签: delphi z-order


【解决方案1】:

只有一种方法可以避免您的应用程序无响应。不要阻塞主线程。

您在询问如何阻止主线程,并保持应用程序响应。应用程序保持响应的唯一方法是及时处理其消息队列。你根本不能同时拥有它。您不能既处理消息又不处理消息。

z 顺序可能会发生更改,因为您的应用程序无法处理您在应用程序未处理消息时所做的各种点击。然后在应用程序再次开始处理消息时处理它们。

结论:如果您希望您的应用程序保持响应,请安排长时间运行的任务相对于主线程异步运行。

【讨论】:

  • 正如我所提到的 - 我没有足够的资源,也没有意愿重写旧代码的深渊。唯一让我感兴趣的是,为什么在查询执行完成后,Windows 没有正确恢复 Windows 的 Z 顺序。
  • 我想我已经解释过了。如果您想让您的应用程序无响应,那么您可能应该接受它会表现不佳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多