Multithreading 从TThread队列中删除匿名方法
从线程内,我将在主线程上下文中运行的事件排队,如下所示:Multithreading 从TThread队列中删除匿名方法,multithreading,delphi,delphi-xe,Multithreading,Delphi,Delphi Xe,从线程内,我将在主线程上下文中运行的事件排队,如下所示: TThread.Queue(nil, procedure begin AddDataToChart(SomeData) end); 现在,在某个时刻,我需要将这些事件排出队列,因为在匿名方法中寻址的组件已被破坏,因此不应接收更多数据。我知道我可以通过调用从TThread synclist中退出事件。不幸的是,这似乎只适用于线程方法,而不适用于排队的匿名方法。因此,我的问题是如何从队列中删除匿名方法。TThread不公开任何删除排队匿名过
TThread.Queue(nil, procedure begin AddDataToChart(SomeData) end);
现在,在某个时刻,我需要将这些事件排出队列,因为在匿名方法中寻址的组件已被破坏,因此不应接收更多数据。我知道我可以通过调用从TThread synclist中退出事件。不幸的是,这似乎只适用于线程方法,而不适用于排队的匿名方法。因此,我的问题是如何从队列中删除匿名方法。
TThread
不公开任何删除排队匿名过程的方法。唯一的选择是使用专用的TThread
对象对匿名过程进行排队(在该对象上调用TThread.queue()
方法的非class
版本,或者将该对象作为AThread
参数传递给TThread.queue()
)的class
版本,然后您可以将该对象传递给TThread.RemoveQueuedEvents()
方法,该方法将TThread
对象作为输入。在调用AddDataToChart
之前,您可以进行验证检查吗?一个简单的全局(范围内)布尔值就足够了。@lurd我确实考虑过这个问题,但发现这个解决方案有点脏。我认为删除排队事件会更干净,因此不会首先运行AddDataToChart代码。也许您可以使用其他线程库(如OTL)做得更好?或者,您可以显式显示这些匿名方法的专用TThreadQueue
,并从应用程序中进行检查。OnMessage@Arioch我知道我可以使用完全不同的线程方法,但我认为可以删除排队匿名方法,这是解决我的问题的最简单的方法。由于这是不可能的,目前我坚持LURD的建议,尽管我真的不喜欢。但另一方面,它是有效的,是解决我的问题最节省的方法。