【问题标题】:Performing search in separate thread delphi在单独的线程delphi中执行搜索
【发布时间】:2020-05-28 21:34:30
【问题描述】:

我正在尝试进行搜索,该搜索在单独的线程上运行并使用 Synchronize 使用匹配的项目更新列表视图。

以前当搜索在主线程上工作时。我正在使用 TButtonedEdit 的 onchange 事件。检测用户希望搜索的字符串。 & 对 listview 项目执行搜索。

我想知道如何检测线程内 TButtonedEdit 文本的变化。或者如何使用线程来实现。

感谢您的帮助。

【问题讨论】:

  • 数据从何而来?我认为找到您搜索的数据需要一些时间?列表视图是虚拟的(所有者数据)吗?
  • @AndreasRejbrand 应用程序在 Oncreate 事件中从文本文件中读取数据。数据存储在“TArray 数组”中。用于搜索。是的,当有很多项目前。 1000+ 这需要时间 & UI 卡住了。我正在使用 TListView(Win32)。
  • 我完全不相信线程是您的解决方案。如果您的列表框不是虚拟的,那么我认为 that 是您的主要问题。使其虚拟化。
  • 让主线程将搜索文本写入变量,然后向搜索线程发出信号。使用锁来同步对变量的访问。
  • @AndreasRejbrand 我是德尔福的新手。从未将 TlistView 用作虚拟。我一定会尝试的。感谢您的建议。

标签: multithreading delphi


【解决方案1】:

您无法直接从工作线程中检测到 TButtonedEdit 的更改。

您可以做的是使用您的 OnChange 事件来通知您的工作线程发生了更改。

或者,如果您在 OnChange 事件中创建工作线程,您可以通知现有线程终止并且不返回任何结果,然后启动新线程以使用新搜索参数执行搜索。请注意,您的搜索过程需要设计为允许线程定期检查工作线程的 Terminated 属性,除非您无法在搜索完成之前终止它。

【讨论】:

  • 直到现在我还在尝试第二种方法。终止前一个线程并为 Onchange 事件中更改的文本创建新线程。但未能正确执行对 Terminated inside thread 的检查。我会尝试再次修复它。关于在 ochange 事件中通知工作线程的第一种方法。你能为此提供一些代码吗?感谢您的回答。
  • 第一种方法是当你已经有一个带有内置消息系统的线程时,比如来自Omni Thread Library 的一些线程。制作这样的系统并非易事,因此自己制作一个并非易事。此外,它甚至可能不值得。取决于你的应用程序做什么。此类系统通常与线程池结合使用,您可以在其中创建有限数量的线程,然后为它们动态分配工作。 ...
  • ... 线程池的优点是可以避免创建和释放线程的开销。但它确实需要额外的代码来为这些线程分配作业。因此,除非您的应用程序一直在进行大量计算,否则所有额外的代码可能都不值得。我怀疑坚持第二种方法对你来说可能就足够了。
  • 是的,现在第一个方法对我来说太过分了。我会坚持第二种方法。感谢您的信息。
猜你喜欢
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多