【问题标题】:Delphi - delay processing if user still typingDelphi - 如果用户仍在输入,则延迟处理
【发布时间】:2014-10-27 21:47:28
【问题描述】:

我有一个具有编辑字段的应用程序。用户将在此字段中键入搜索短语。我试图实时显示对用户文本的点击。输入三个字符后,我进行第一次搜索,然后在每个字符或退格后再次执行搜索。

问题是,随着我的搜索算法越来越先进,进行搜索需要更长的时间。用户可以比生成/显示之前的结果更快地键入。结果,该应用程序感觉迟缓/缓慢。我有几个选择: (1)。等到用户按回车键 (2)。将搜索放在不同的线程中并异步执行。有点犹豫,因为我之前从未使用过线程(3)。实现某种类型的延迟,以便如果用户仍在键入,我等待用户停止。

我倾向于选项 3,但如何检测用户是否仍在输入?我是否必须为每次击键保留一个时间戳?

【问题讨论】:

  • 异步搜索。立即开始。当您准备好显示结果时显示它们。如果用户在您准备好之前输入了内容,请放弃您之前的搜索工作,然后重新搜索。
  • @David,这可能是不必要的资源浪费(当然取决于搜索的内容以及搜索方式;我们前段时间已经讨论过这个问题)。 user1009073,对于案例 3,我写了this component
  • 一个简单的TTimer 会以很小的间隔(f.i. 250ms)和Timer1.Enabled := false; Timer1.Enabled := true; 来重置编辑字段的每个更改事件的计时器。 TTimer.OnTimer开始搜索
  • @TLama 这有什么关系?作为用户,我希望我的计算机资源能够用于更快地得到我的答案。
  • @TLama 在这种情况下,等待四分之一秒几乎没有任何好处。如果你不能取消 db 并且查询成本很高,那么让用户告诉你他们已经准备好了。

标签: performance delphi user-interface


【解决方案1】:

如果我是你,我会坚持使用线程解决方案。


它更快,不会滞后,并且 - 如果编写得当 - 不会引入额外的问题,并且是通过不那么危险或困难的问题学习线程的好机会。如果您选择此解决方案,则必须执行四个简单的步骤:

  1. Create OnSearchFinished() 事件处理程序 在您的表单上并将其分配给消息代码(如 WM_USER + 1)。此消息将在您的线程完成生成搜索结果后发送。
  2. 在将执行搜索的 .Execute() 方法中使用您的搜索代码创建一个 TThread 后代。它必须有一个包含搜索词的字段。 (.Execute()不会被直接调用,所以它不能处理参数。你通过.Resume()ing他们来执行TThread后代。)这个类的实例可以在你的表单的构造函数中创建,需要在暂停状态。
  3. 假设你的搜索代码有一个主循环,如果你的主程序在你的对象上调用.Terminate(),你将have to check如果有,你必须退出你的循环。
  4. 在您处理搜索的.OnChange().OnKeyDown() 中,您应该(首先).Terminate() 您的线程(以停止已经运行的搜索,如果有的话),然后将该字段设置为您的新搜索术语和.Resume()它。

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 2011-02-26
    • 2010-12-26
    • 2014-04-18
    • 2016-05-11
    相关资源
    最近更新 更多