2009-10-02 246 views
4

允许对象在线程上执行方法的最佳解决方案是什么?该对象是TThread的所有者,该线程仅包含一个TidHTTP(阻塞套接字)来发布请求并解析响应。如何在单独的线程上执行某些命令?

实施例:

  • 对象>的线程
  • 线程中执行请求>经由idHTTP发送请求,等待应答,将结果发送到对象
  • 螺纹>等待另一个请求
  • 对象>根据请求的结果更新UI

回答

4

一个相对安全的方式与第读取使用命令队列。

  • 对象在队列中发出请求(使用信号量)。
  • 胎面检查(使用信号灯)队列,如果它充满执行最久远的请求(如果你愿意,你可以 介绍的优先级)。
  • 如果任务完成,则会通知对象(例如,使用回调函数)。

线程通常睡,只有醒来以检查队列。如果什么都没有做,它会“按下贪睡按钮”并再次睡觉。

一定要警惕利用信号量对队列的访问。否则会有数据损坏的可能性,并且您有难以发现的错误。

+0

感谢您的回答:) – Ariel32 2009-10-02 11:09:23

0

我不知道“最好” - 取决于你的标准是什么。如果您对自己的要求稍作扩展,我们可能会提供更具体的帮助。与此同时...

最简单的方法是让所属对象写请求的线程,无论是到一个或多个属性或通过一个公共的方法。属性/方法后面的数据字段不能直接通过主执行例程访问:使用由Synchronize()调用的方法将这些数据字段复制到可由Execute()例程使用的变量中。当速度不是主要目标时,我使用这种方法,并且拥有的对象不需要排队多个请求。

很多人贬损使用同步,但它取决于你正在努力实现的功能。我试图让事情变得简单,直到需求需求为止。

如果吞吐量更是一个问题,或者如果你需要有重叠的请求,你可以使用一个队列来存储请求,以获得由TCriticalSection控制的队列。你也可以直接使用TThreadList,或者作为你自己的类型化存储的基础 - 我不知道TThreadList的通用等价物,虽然可能有一个。

+0

感谢您的帮助!我需要使用队列来存储请求,并且线程只能同时执行一个请求。我不能生成更多的线程使用相同的idHTTP,因此即使所有的请求都是独立的,它们也必须一一执行。我正在处理的应用程序在这篇文章中有更多解释:http://stackoverflow.com/questions/1506212/complex-software-architecture – Ariel32 2009-10-02 11:32:00

1

的另一种方法,值得一提的是由Andreas Hausladen使用Async Calls。这是一个简单易用且写得很好的线程包装器,它在功能性环境中运行良好。

相关问题