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

Performance Delphi-如果用户仍在键入,则延迟处理,performance,delphi,user-interface,Performance,Delphi,User Interface,我有一个应用程序,它有一个编辑字段。用户将在此字段中键入搜索短语。我试图实时显示对用户文本的点击。输入三个字符后,我进行第一次搜索,然后在每个字符或退格后再次执行搜索 问题是,随着我的搜索算法越来越先进,搜索所需的时间也越来越长。用户可以比生成/显示结果之前更快地键入。因此,应用程序感觉迟钝/缓慢。我有几个选择: (1). 等待用户点击回车键(2)。将搜索放在不同的线程中,并异步执行。这里有点犹豫,因为我以前从未使用过线程(3)。实现某种类型的延迟,以便在用户仍在键入时,我等待用户停止 我倾向

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

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


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

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


它速度更快,不滞后,而且如果编写得当,不会带来额外的问题,并且是通过一个不太危险或困难的问题学习线程的绝佳机会。如果选择此解决方案,则必须执行四个简单步骤:

  • 在表单上创建
    OnSearchFinished()
    事件处理程序,并将其分配给消息代码(如
    WM\u USER+1
    )。此消息将由线程在生成搜索结果后发送
  • 创建一个
    TThread
    子体,在其
    中使用搜索代码。Execute()
    方法执行搜索。它必须有一个带有搜索词的字段。(不会直接调用
    .Execute()
    ,因此它无法处理参数。您可以通过
    .Resume()
    对其执行线程子代。)此类的实例可以在窗体的构造函数中创建,并且需要在挂起状态下创建
  • 假设你的搜索代码有一个主循环,如果你的主程序在你的对象上调用了
    .Terminate()
    ,你就会这样做。
    如果有,你必须退出你的循环
  • 在处理搜索的
    .OnChange()
    .OnKeyDown()
    中,您应该(首先)终止()线程(如果有,停止已经运行的搜索),然后将该字段设置为新的搜索词,然后
    .Resume()

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