【问题标题】:Performing an action when the application is idle在应用程序空闲时执行操作
【发布时间】:2010-09-16 19:33:10
【问题描述】:

我有一个非常简单的应用程序,其中包含一个表单、一个 Richedit 和一个菜单。我正在尝试自动将文本保存在 Richedit 上并执行其他任务,但在应用程序空闲时 - 当用户不写作或应用程序失去焦点或其他情况时。

我尝试从 Internet 上找到的大量示例代码创建一个 OnIdle 事件处理程序,但它的作用恰恰相反,它会在我 am 使用该应用程序时激活。这个link 就是一个例子。

我还使用了一个计时器并检查用户最后一次写信给richedit是什么时候,但如果可能的话我宁愿不使用计时器。

有人知道如何检测应用程序是否空闲并在空闲时运行一些代码吗?我正在使用德尔福 7。

【问题讨论】:

  • 您的解决方案肯定需要在某个地方设置一个计时器:您还要如何指定“空闲”是指空闲一毫秒还是空闲几秒钟?
  • idle 表示空闲。用户没有做任何事情。如果你想让它持续 1 秒,然后是 1 秒,1 分钟,然后是 1 分钟。然后选择一个没有区别
  • 计时器就是这样做的方式!为什么你不想使用计时器?顺便说一句,将一个小的 RTF 文档保存到磁盘需要几毫秒;即使您每秒保存十次,最终用户也不会注意到它!此外,TTimer 并不像 Borland 那样奇怪,它只是原生 Win32 功能的包装器。
  • 因为 ttimer 真的不是一个好的定时器。但是无所谓。我会用它。谢谢
  • 连续保存操作之间是否有 60.1 秒而不是 60.0 秒有关系吗?

标签: windows delphi


【解决方案1】:

我也会推荐一个计时器,但会“重置”倒计时(关闭然后重新打开)以响应 Richedit 中发生的任何键盘事件。这样,您就不会在用户尝试输入时进行保存。

正如 Andreas 所指出的,以下是实际实现的方法: 每次用户执行某些操作时,例如更改编辑器的插入符号位置,执行 Timer1.Enabled := false; Timer1.Enabled := 真。这将重置计时器。实际上,在最后一个 Timer1.Interval 毫秒内没有用户活动之前,计时器永远不会触发

【讨论】:

  • 感谢克里斯,我正在努力理解。你想让我创建一个计时器并检查一个变量,如果它是0,那么写(用户空闲)如果它是1,不要写,用户目前正在richedit上写。这是正确的吗?
  • 每次用户执行一些操作,例如更改编辑器的插入符号位置,执行Timer1.Enabled := false; Timer1.Enabled := true。这将重置计时器。实际上,在最后一个Timer1.Interval 毫秒内没有用户活动之前,计时器永远不会触发。
  • @Andreas - 谢谢,我添加了您的示例以使答案更强大。
  • 另外,您应该在保存文本后禁用计时器。下一个用户操作将重新启用它。
【解决方案2】:

最好使用计时器。 OnIdle 会经常触发。我相信该消息的含义是队列中的所有消息都已被处理。因此,每次处理完消息时,都会触发 OnIdle。

您可以做的是在富编辑中的每个 OnChange 事件之后将变量设置为时间戳。然后,使用计时器,每 X 秒检查一次,以查看该时间戳是否超过 5 秒。如果是,请进行保存。

【讨论】:

  • 谢谢,所以没有办法通过 Windows API、消息或除计时器之外的其他方式来执行此操作。好的...
【解决方案3】:
function GetIdleTime:DWORD;
var
  lastI : TLastInputInfo;
begin
  lastI.cbSize := SizeOf(lastI);
  GetLastInputInfo(lastI);
  Result := (gettickcount - lastI.dwTime) div 1000;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if GetIdleTime = 60 then Memo1.savetofile('C:\jgs.tmp');
end;

使用这个

【讨论】:

  • 您应该检查 GetIdleTime >= 60,否则您可能会错过这一刻。
猜你喜欢
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多