Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 从TThread队列中删除匿名方法_Multithreading_Delphi_Delphi Xe - Fatal编程技术网

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的建议,尽管我真的不喜欢。但另一方面,它是有效的,是解决我的问题最节省的方法。