如何使用OmniThreadLibrary访问线程变量?

这似乎是一件容易的事,我只是不知道,开始使用OmniThreadLibrary哪种方式:

我创建了一个任务,做在后台进行一些处理。 结果被存储在任务类的字段和连续填充有新的值。

现在,主线程想读这些领域,并显示它们的值不时。
因此,需要访问这些领域,并确保他们不会在这些时刻(同步)写入。

这可怎么用OmniThreadLibrary做了什么?

--------------解决方案-------------

有在OTL所有者/线程数据共享没有直接的支持,因为我所有的多线程的经验告诉我,这始终是一个坏事情。 (同意,有时是唯一的解决办法,但仍然是一件坏事。)

你应该与第二mghie的建议去 - 创建一个(可选接口为基础的)对象,这个对象(或它的接口)传递给线程。 事情是这样的:

sharedData := TSharedData.Create;
task := CreateTask(worker).SetParameter('shared', sharedData).Run;

工人:

sharedData := Task.Param['shared'].AsObject as TSharedData;

解决问题的另一种方法是发送一个“请发送更新'消息以每当用户按下UpdateNow按钮的任务。 那么任务将包含当前状态的物体作出反应。 但是,如果该任务执行冗长不间断计算该溶液是不是真的适当和共享状态的方法效果更好。

退房OTL测试23,它实现了一个后台文件搜索。 该SetParameter()方法是用来设置搜索属性的Comm信道用来传送回结果给主线程。 通信已经是线程安全的,你不需要实现任何进一步的同步。

编辑:

如果你不想一推,但拉模式,那么你当然可以使用标准的同步工具:即具有在所有访问用于防止并发访问数据的一个关键部分的对象。 该目的可以是任务对象本身,或(再次)调用由所述GUI线程创建和传递到任务的任何第三个目的SetParameter() 。 如果你不使用对象,而是一个接口指针,你会得到更多的安全,破坏的顺序不再重要,持有数据的对象将只在最后一个引用它实现了接口复位摧毁。

分类:多线程 时间:2012-01-01 人气:0
分享到:

相关文章

  • 什么在德尔福XE多线程是新的? 2012-07-02

    我看到前一段时间人们讨论关于德尔福XE和有关的事实,德尔福,因为它实现了多线程的方式有些'本土'问题的新的多线程. 他们就推荐一些外部库来替代默认的德尔福多线程. 你能指出我的一些文档和德尔福XE最流行的多线程库? 谢谢 --------------解决方案------------- 我相信在座的新引入的功能已经覆盖. 对于文档的一部分,这里是经典教程书马丁·哈维的存档副本. 多线程 - 德尔福方式. 看完你很可能会体会到什么是没有真正的需要任何第三方库(除非,也许,线程池),记住后,框架不简化

  • 德尔福开发商切换到C# 2013-05-28

    我是一个Delphiholic相当长的一段时间了,最​​近我想学习一些C#为好,但我有点'"害怕未知的",我做了一些简单的应用程序作为一个试驾C#和我必须承认,我很喜欢它,但是我真的不喜欢的IDE ......这正在这里说的是,如果其他人谁去了这条道路会回答,我将不胜感激的问题: 作为一个Delphi开发人员有哪些来自Delphi语言的"主基本"的变化(由基本我的意思是基本 - 实用功能,溪流等),我已经习惯了加上"系统,类窗口",以使用不&qu

  • 什么是一个很好的多线程本书德尔福? 2013-03-22

    我在哪里可以得到一本好书Delphi的线程. 一些能够满足总共初来乍到的主题. --------------解决方案------------- 不是一本书,但文章多线程处理-德尔福的方式 ,由马丁·哈维,是一个很好的开始. 该书从史蒂夫·特谢拉和Xavier帕切科德尔福™6开发人员指南有整整一章叫"多线程技术". 这是一个很好的书. 你也可以检查此意甲文章从Delphi边角部位 等待线程 在线程中运行查询 从WinAPI的创建线程直 如何中断线程的执行 通过临界区线程同步 从Embar

  • 德尔福:通过一个插座多线程发送数据 2012-07-04

    可有一个人给我的想法如何在直通多线程一个连接发送和接收数据. 该模型是这样的: 我所知道的是,如果所有三个客户端同时发送数据时,"客户机X"将接收所有的合并所接收的数据,和"客户机X"不能分开的数据,以确定哪部分是从该客户端. 德尔福2010年,印中,Win7. 很抱歉,如果我的英语不好,我希望你明白的想法. --------------解决方案------------- 你需要实现一个锁定机制,如临界区或互斥体,防止多线程正好在同一时间写套接字. 当接收发往多个线

  • 德尔福调试多线程应用程序 - 如何获取一个消耗100%的CPU 2012-10-19

    我调试多线程的德尔福应用程序. 我们有,经过连接到服务器时,客户端应用程序是得到100%的CPU故障. 有没有办法为我调试,知道shich线程的DOI是什么? --------------解决方案------------- 进程管理器会给你使用细节到的任何进程的线程级. 运行你的应用程序 运行进程资源管理器(下载后;-) 双击可执行文件在进程列表中 选择主题选项卡,在那里你会看到: 线程ID CPU使用率 循环三角洲 和起始地址 工贸署应该是足够明确你的CPU线程霸占. 正如保罗萨西克表明,进程

  • 德尔福多线程应用程序内置在Vista中,并不会在XP上运行 2013-07-19

    我真的很为难. 我在Vista上运行德尔福2007年. 我做了很多的应用,并在XP没有问题运行它们. 这一最新的应用程序必须使用线程. 我敢肯定我的代码是正确的. 它在Vista上运行良好,但是当我在XP上运行(试了多台PC机)我的计划似乎滞后(这两个操作系统的32位,XP SP3和Vista SP1,DOTNET V2). 最好的例子是,如果我拔掉串口我的网络公司将继续运行等. 我在我的XP机器上安装delphi的,跑到我的计划,而德尔福运行. 正如我从建在Vista中的exe文件运行它. 它

  • 德尔福/印IdHttpServer不是多线程的? 2013-07-30

    我使用德尔福2006年和印10.我创建一个表单和下拉的IdHttpServer组成部分. 我做的OnCreate事件的形式来设置服务器的活动,我进入这行服务器的OnCommandGet: procedure TForm3.IdHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin Beep; Sleep(10000

  • 德尔福多线程和Oracle数据库 2012-01-20

    我需要多次登录和查询执行到Oracle数据库,10个用户每过程中,每台电脑10个进程. 我在想,我将创建10个线程,每个用户登录一个线程. 这是可行的? 任何建议表示赞赏. 很新的线程. 更新: 感谢所有的意见和解答. 这里有一些额外的细节: 使用Oracle 10.2,德尔福XE和动态创建dbExpress组件. 我们的设计是运行每台机器10个进程,每个进程模拟10个用户登录. 每个登录是它自己的线程中(其实我需要在每个线程两次登录,所以我实际上是创建每台机器200次). 对于这个模拟演练,建

  • 执行点在2010年德尔福其他线程 2012-06-03

    我正在开发使用德尔福2010年(使用优秀OmniThreadLibrary)一个多线程的客户端应用程序和我有很难与调试,因为我不断地从一个线程交换到另一个. 我不知道是否有可能(使用任何工具或插件,我不在乎!)找到当前执行点,而不仅仅是当前线程,但对于所有其他线程为好. 一个简单的例子/报告: Thread #1 stopped at line #5 Thread #2 stopped at line #25 (<-- breakpoint set here, causing Delphi to

  • 您可以收到活动在德尔福XE辅助线程? 2012-10-13

    我想有三个线程在一个示例应用程序. 线程#1(主线程) - 用户界面/ GUI 线程#2 - 绑定到一个串口设备通过传递到数据队列中的事件接收数据. 线程#3 - 当队列条目被激活,过程数据节点,释放数据对象. 我们的目标是 a)阻止数据丢失时,一个按钮或形式在主窗体上举行的鼠标. B)快速获取从事件中的数据,它的东西在排队,回去睡觉 C)处理数据时,我们有它,否则睡觉. 像AsyncoPro包可以绑事件处理到非主线程? 我从来没有做过多少与串口事件驱动的应用程序,大部分我所用的调查工作,我想要

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.909 (s). 10 q(s)