如何解决如何检查PROGRAM空闲时间,而不是SYSTEM空闲时间?
| 我已经潜伏了一段时间,这是一个很好的资源。现在,我将尝试成为一名活跃成员... :) 我有一个程序,有时需要递归扫描某些目录(该程序的这一部分正在改进中,但暂时无法使用)。为了避免用户不得不等待此扫描,我希望在用户不使用我的程序的情况下进行扫描。 我打算通过运行一个检查空闲时间的计时器来实现它。我发现了以下检查系统空闲时间的方法: http://www.delphitips.net/2007/11/11/how-to-detect-system-idle-time/ 这将起作用,但是即使用户正在使用同一台计算机上的其他程序,我也希望激活该功能。这样,如果他切换到另一个程序,我可以赶上我需要做的扫描。 我意识到我可以在后台线程中进行扫描,并且可以在某个时候实现某种或某种Windows挂钩,但还不是现在。 编辑: 这里的目标是对程序进行相对容易的更改,以执行在用户未积极使用MY应用程序时可能排队的任何扫描。扫描不是特别密集,但是它不是在线程中完成的,因此在进行过程中会冻结我的应用程序。基本上,我在寻求长期解决方案时正在寻求快速的胜利。解决方法
使用
Application.OnIdle
事件。当您的程序没有更多要处理的窗口消息时,将触发该事件。键盘和鼠标都生成消息,因此,如果没有更多消息,则即使有焦点,用户也不会使用您的程序。
procedure TJasonForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
var
NoMoreFiles: Boolean;
begin
// TODO: Scan for the next file
Done := NoMoreFiles;
end;
只要Done
为False并且队列中没有消息,您的程序将继续调用该事件处理程序,从而使您可以找到更多文件。当用户生成一些输入时,您的程序将在再次调用OnIdle
之前处理这些消息。
扫描完文件系统后,将Done
设置为True,以便程序停止重新调用OnIdle
处理程序。如果您忽略这样做,那么您的程序将重复使用所有可用的CPU时间来调用不执行任何操作的事件处理程序。
为此,您需要使用非递归搜索例程。递归搜索将在返回之前搜索整个文件系统,但是如果这样做,则OnIdle
处理程序将挂起您的程序,这与您想要的相反。您可以使用目录名称的队列,并且每次触发该事件时,从队列中弹出一个项目,进行搜索,然后将其内容添加到队列的末尾。
, ...但是我希望激活
即使用户正在工作也能正常工作
与相同的其他程序
电脑。这样,如果他切换到
另一个程序,我可以赶上
我需要做的扫描。
在Application.OnActivate中停止扫描,然后在Application.OnDeactivate中恢复。
,您需要一个单独的线程,该线程将在系统空闲时恢复,或在有活动时暂停。一种简单的方法是放置一个计时器组件,并检查系统是否闲置并且线程已挂起或不使用ResumeThread,SuspendThread
看这里
http://pastebin.com/8X9Sg42H我为您的情况精心制作了一些东西
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。