这似乎是一项简单的任务,我只是不知道从哪种方式开始使用OmniThreadLibrary:
我创建了一个在后台执行一些处理的任务。结果存储在task类的字段中,并不断填充新值。
现在,主线程希望读取这些字段并不时地显示它们的值。
因此,它需要访问这些字段,并确保它们不会在这些时刻被写入(同步)。
如何使用OmniThreadLibrary做到这一点呢?
发布于 2011-01-12 01:33:19
在OTL中没有对所有者/线程数据共享的直接支持,因为我所有的多线程经验都告诉我,这样做总是不好的。(同意,有时这是唯一的解决方案,但这仍然是一件坏事。)
您应该遵循第二个mghie的建议-创建一个(可选的基于接口的)对象,并将此对象(或其接口)传递给线程。如下所示:
sharedData := TSharedData.Create;
task := CreateTask(worker).SetParameter('shared', sharedData).Run;工人:
sharedData := Task.Param['shared'].AsObject as TSharedData;解决这个问题的另一种方法是在用户按下UpdateNow按钮时向任务发送“请发送更新”消息。然后,该任务将使用包含当前状态的对象进行响应。但是,如果任务执行冗长的不可中断计算,则此解决方案并不真正合适,并且共享状态方法工作得更好。
发布于 2011-01-12 00:13:48
查看OTL测试23,它实现了后台文件搜索。SetParameter()方法用于设置搜索属性,Comm通道用于将结果传回主线程。通信已经是线程安全的,您不需要实现任何进一步的同步。
编辑:
如果您不想要推模型而是拉模型,那么您当然可以使用标准的同步工具:具有临界区的对象,所有访问器都使用该临界区来保护数据不被并发访问。该对象可以是任务对象本身,也可以是由GUI线程创建并通过(再次)调用SetParameter()传递给任务的任何第三个对象。如果你不使用对象而是使用接口指针,你将获得更多的安全性,因为销毁的顺序不再重要,保存数据的对象只有在对它所实现的接口的最后一个引用被重置时才会被销毁。
https://stackoverflow.com/questions/4659520
复制相似问题