我已经潜伏了一段时间,这是一个很好的资源.现在我将尝试成为一名活跃的会员...... :)
我有一个程序偶尔需要递归扫描一些目录(这部分程序的改进正在进行中,但暂时还没有准备好).为了避免用户不得不等待这种扫描,我希望在用户不使用我的程序时进行扫描.
我打算通过运行一个检查空闲时间的计时器来实现它.我发现以下内容用于检查系统空闲时间:http: //www.delphitips.net/2007/11/11/how-to-detect-system-idle-time/
这将是有用的,但即使用户正在使用同一台计算机上的其他程序,我也希望激活该功能.这样,如果他切换到另一个程序,我可以赶上我需要做的扫描.
我意识到我可以在后台线程中进行扫描,并且在某些时候会实现某种或某种类型的Windows挂钩,但不仅仅是.
编辑:这里的目标是对程序进行相对容易的更改,以便在用户未主动使用我的应用程序时执行任何可能排队的扫描.扫描不是特别密集,但它不是在一个线程中完成,因此在进行中冻结我的应用程序.基本上,我正在寻找一个快速的胜利,而我正在制定一个更长期的解决方案.
Rob*_*edy 14
使用该Application.OnIdle活动.当您的程序没有更多要处理的窗口消息时,将触发该事件.键盘和鼠标都生成消息,因此如果没有消息,则用户不使用您的程序,即使它具有焦点.
procedure TJasonForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
var
NoMoreFiles: Boolean;
begin
// TODO: Scan for the next file
Done := NoMoreFiles;
end;
Run Code Online (Sandbox Code Playgroud)
只要Done是False并且队列中没有消息,您的程序将继续调用该事件处理程序,允许您查找更多文件.当用户生成一些输入时,程序将在OnIdle再次调用之前处理这些消息.
扫描完文件系统后,设置Done为True,以便程序停止重新调用OnIdle处理程序.如果你忽略了这一点,那么你的程序将使用所有可用的CPU时间重复调用一个什么都不做的事件处理程序.
为此,您需要使用非递归搜索例程.递归搜索将在返回之前搜索整个文件系统,但是如果你这样做,那么OnIdle处理程序将挂起你的程序,这是你想要的对应物.您可以使用目录名称队列,每次触发事件时,从队列中弹出一个项目,搜索它,并将其内容添加到队列的末尾.
| 归档时间: |
|
| 查看次数: |
5285 次 |
| 最近记录: |