【问题标题】:Remove anonymous methods from TThread Queue从 TThread 队列中删除匿名方法
【发布时间】:2014-01-09 14:14:12
【问题描述】:

在一个线程中,我将事件排队以在主线程的上下文中运行,如下所示:

TThread.Queue(nil, procedure begin AddDataToChart(SomeData) end);

现在在某些时候我需要将这些事件出列,因为在匿名方法中寻址的组件已被破坏,因此不应接收更多数据。我知道我可以通过调用TThread.RemoveQueuedEvents 将事件从 TThread 同步列表中取出。不幸的是,这似乎只适用于 Thread 方法,但不适用于排队的匿名方法。所以我的问题是如何从队列中删除我的匿名方法。

【问题讨论】:

  • 您可以在致电AddDataToChart 之前进行验证检查吗?一个简单的全局(范围内)布尔值就足够了。
  • @LU RD 我实际上想过这个,但发现这个解决方案有点脏。我认为删除排队的事件会更干净,因此首先不运行 AddDataToChart 代码。
  • 也许您可以使用其他线程库(如 OTL)做得更好?或者,您可以明确指定这些匿名方法的专用 TThreadQueue<TProc> 并从 Application.OnMessage 进行检查
  • @Arioch 我知道我可以使用完全不同的线程方法,但我认为可以删除排队的匿名方法,这将是解决我的问题的最简单方法。由于这是不可能的,目前我坚持 LURD 的建议,虽然我不是很喜欢。但另一方面,它可以工作,并且是解决我的问题的最简洁的解决方案。

标签: multithreading delphi delphi-xe


【解决方案1】:

TThread 没有公开任何删除排队匿名过程的方法。唯一的选择是使用专用的TThread 对象对匿名过程进行排队(在该对象上调用TThread.Queue() 方法的非class 版本,或将该对象作为AThread 参数传递给class TThread.Queue() 的版本),那么您可以将该对象传递给以 TThread 对象作为输入的 TThread.RemoveQueuedEvents() 方法。

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 2019-11-06
    • 2021-04-01
    • 1970-01-01
    • 2011-08-10
    • 2016-01-31
    • 2018-12-11
    • 2012-08-17
    相关资源
    最近更新 更多