为了演示这个问题,我创建了一个由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查询(任何,我打开存储过程)。它是同步的,也就是说,应用程序挂起至少10秒钟。此时触发窗口重影。 Windows为所有可以最小化,移动和关闭的Windows陈旧应用程序创建Windows Ghost。执行查询后,应用程序恢复处理消息,一切都恢复到原始状态。
一定是这样,但对我来说却不然。事实上,在解冻Windows程序的Z顺序改变之后,Windows的顺序混合了。此外,顶部(或底部)可以离开任何窗口,我没有注意到任何模式。在取消重影时,Windows似乎无法正确恢复Z顺序。
在Delphi 2007中也发现了这种行为。请注意,在Delphi调试器模式下,重影被禁用,您将看不到此行为。在没有调试器的情况下运行应用程序以查看此行为 使用DisableProcessWindowsGhosting禁用模式重影后 - 一切正常。
但我不想完全禁用此模式,程序通常会挂起超过5秒,这种模式很有用:用户仍然可以更好地重新绘制以不重绘的方式重新绘制的Windows 。要重写一半程序代码以进行异步执行查询是一项非常漫长而耗时的任务,我担心我们没有足够的资源,尽管这无疑是正确的方法。
MainFormOnTaskBar属性与我的问题无关,delphi 7中没有这样的属性。
这对我以外的其他人有影响吗?如果不是 - 我哪里出错了?如何强制Windows正确重建Windows的序列?
答案 0 :(得分:2)
有一种方法可以避免您的应用程序无响应。不要阻止主线程。
您正在询问如何阻止主线程,并使应用程序保持响应。应用程序保持响应的唯一方法是让它及时处理其消息队列。你根本无法双管齐下。您不能同时处理消息而不处理消息。
由于您的应用程序无法处理您在应用程序未处理消息时所做的各种点击,因此z顺序可能会发生变化。然后在应用程序再次开始处理消息时处理它们。
结论:如果您希望应用程序保持响应,请安排长时间运行的任务与主线程异步运行。