【问题标题】:Stopping "Not responding"停止“无响应”
【发布时间】:2014-05-14 02:43:05
【问题描述】:

我有一个复制大量文件的备份过程 (CopyFileEx),每隔几分钟,windows 似乎需要休息一下,可能是分页或清除缓冲区之类的。在此期间,主窗体闪烁并在主 Caption 中显示“未响应”。

几秒钟后它再次闪烁,消息已消失,世界一切正常,过程继续。

有什么方法可以阻止闪烁和消息吗?

【问题讨论】:

  • 从不同的线程运行文件复制,以免阻塞主线程。
  • @DavidHeffernan 谢谢,但我从来没有使用过线程,也不确定我是否只想为这个应用程序使用线程。我在 74 岁时作为朋友的免费赠品这样做,对“线程”学习曲线并不真正感兴趣。我尝试了一个使用线程的文件复制单元,但 PC 可能会被关闭,因为它向操作员显示进程已完成,但实际上线程仍在后台敲击。
  • 为此使用线程是唯一的解决方案。如果您不想使用线程,则必须接受冻结的 UI。

标签: delphi delphi-5


【解决方案1】:

“无响应”有一个非常具体的含义:应用程序的 UI 线程没有继续泵送消息。Windows 称之为“无响应”的原因是因为消息泵是发送用户输入的内容到您的代码响应的应用程序。一旦理解了这一点,保持应用程序响应的方法就很明显了:不要在 UI 线程中长时间运行、阻塞操作。实际上实现这一点可能很棘手,原因有两个。

首先,反馈:如果您在单独的线程中执行长时间操作,您希望它向用户报告其进度,这只能在 UI 线程中完成。所以你需要使用TThread.SynchronizeTThread.Queueor something similar(无耻的自我推销)将UI更新回发到你的主线程。

其次,如果您在 UI 中有一个“复制所有内容”按钮,并且它需要一分钟才能运行,并且它在不同的线程上运行但您保持主线程响应,那么是什么阻止了用户单击在任务完成之前再次“复制所有内容”按钮?根据您的程序设计,这可能是也可能不是有效的操作,但事实并非如此,它可能会导致问题。如果这可能是一个问题,请确保您的设计对其进行补偿,例如通过在单击按钮后禁用该按钮并在完成后重新启用它。

最后,如果你打算用多线程做任何复杂的事情,我强烈建议你好好看看 OmniThreadLibrary... 除了标签说你使用的是 Delphi 5,它可以不要运行 OTL。你真的应该看看更新。

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多