Delphi - 如果用户仍在键入,则延迟处理

时间:2014-10-26 13:03:14

标签: performance delphi user-interface

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

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

我倾向于选项3,但如何检测用户是否仍在键入?我是否必须保持与每次击键相关的时间戳?

1 个答案:

答案 0 :(得分:0)

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


速度更快,不会滞后 - 如果写得正确 - 不会引入其他问题,并且是一个很好的机会,可以通过一个不那么危险或困难的问题来学习线程。如果您选择此解决方案,则必须执行四个简单步骤:

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