如何检查PROGRAM空闲时间,而不是SYSTEM空闲时间?

时间:2011-05-25 14:34:57

标签: delphi

我已经潜伏了一段时间,这是一个很好的资源。现在我将尝试成为一名活跃的成员...... :)

我有一个程序,偶尔需要递归扫描一些目录(这部分程序的改进正在进行中,但暂时还没有准备好)。为避免用户不得不等待此扫描,我希望在用户不使用我的程序时进行扫描。

我打算通过运行一个检查空闲时间的计时器来实现它。我发现以下内容用于检查系统空闲时间: http://www.delphitips.net/2007/11/11/how-to-detect-system-idle-time/

这可以起作用,但即使用户在同一台​​计算机上使用其他程序,我也希望激活该功能。这样,如果他切换到另一个程序,我就可以赶上我需要做的扫描。

我意识到我可以在后台线程中进行扫描,并且在某些时候会实现某种或某种类型的Windows挂钩,但不仅仅是。

编辑: 这里的目标是对程序进行相对容易的更改,以便在用户未主动使用MY应用程序时进行任何可能排队的扫描。扫描不是特别密集,但它不是在一个线程中完成,因此在进行中冻结我的应用程序。基本上,我正在寻找一个快速的胜利,而我正在制定一个更长期的解决方案。

3 个答案:

答案 0 :(得分:14)

使用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处理程序将挂起你的程序,这是你想要的对面。您可以使用目录名称队列,每次触发事件时,从队列中弹出一个项目,搜索它,并将其内容添加到队列的末尾。

答案 1 :(得分:2)

  

...但我更愿意激活   甚至在用户工作时也能正常工作   与其他程序相同   电脑。这样,如果他切换到   另一个程序,我可以赶上   我需要做的扫描。

在Application.OnActivate中停止扫描并在Application.OnDeactivate中继续。

答案 2 :(得分:0)

您需要的是一个单独的线程,当系统空闲或有活动时暂停时,该线程将恢复。一个简单的方法是放置一个Timer Component并检查系统是否空闲且线程是否挂起使用ResumeThread,SuspendThread

看这里

http://pastebin.com/8X9Sg42H我根据你的情况制作了一些东西