我有一个复制大量文件的备份过程(CopyFileEx),每隔几分钟,Windows似乎需要休息,可能是分页或清除缓冲区等。在此期间,主窗体闪烁并在主标题中显示“未响应”。
几秒钟后,它再次闪烁,消息已经消失,一切都与世界一致,并且过程继续。
有什么方法可以阻止眨眼和消息吗?
答案 0 :(得分:7)
“Not Responding”具有非常具体的含义:应用程序的UI线程不会继续抽取消息。 Windows称之为“无响应”的原因是因为消息泵是用户输入的内容到您的代码响应的应用程序。一旦理解了这一点,保持应用程序响应的方法显而易见:不要在UI线程中运行很长时间,阻塞操作。实际上实现这可能很棘手,原因有两个。
首先,反馈:如果您在一个单独的线程中进行长时间的操作,您希望它向用户报告其进度,这只能在UI线程中完成。因此,您需要使用TThread.Synchronize
或TThread.Queue
or something similar(无耻的自我推销)将UI更新发回主线程。
其次,如果你在UI中有一个“copy everything”按钮,它需要一分钟才能运行,并且它在另一个线程上运行,但你保持主线程的响应,是什么阻止用户点击在任务完成之前再次“复制所有内容”按钮?根据您的程序设计,这可能是也可能不是有效的操作,但事实并非如此,它可能会导致问题。如果这可能是一个问题,请确保您的设计对其进行补偿,例如在您单击按钮后禁用该按钮并在完成后重新启用它。
最后,如果您要使用多线程执行任何复杂的操作,我强烈建议您仔细查看OmniThreadLibrary ...除非标记显示您使用的是Delphi 5,哪个不能运行OTL。你真的应该看看更新。