Multithreading 如何在单独的线程上执行某些命令?

Multithreading 如何在单独的线程上执行某些命令?,multithreading,delphi,network-programming,Multithreading,Delphi,Network Programming,允许对象在线程上执行方法的最佳解决方案是什么?该对象是TThread的所有者,该线程只包含一个用于post请求和解析响应的TidHTTP(阻塞套接字) 例如: 对象>在线程上执行请求 线程>通过idHTTP发送请求,等待响应,将结果发送到对象 线程>等待另一个请求 对象>根据请求的结果更新UI 与线程通信的一种相对安全的方式是使用命令队列 对象在队列中发布请求(使用信号量) tread检查队列(使用信号量),如果队列已满,则执行最早的请求(您可以 如果您愿意,请介绍优先事项) 如果任务完成,

允许对象在线程上执行方法的最佳解决方案是什么?该对象是TThread的所有者,该线程只包含一个用于post请求和解析响应的TidHTTP(阻塞套接字)

例如:

  • 对象>在线程上执行请求
  • 线程>通过idHTTP发送请求,等待响应,将结果发送到对象
  • 线程>等待另一个请求
  • 对象>根据请求的结果更新UI

与线程通信的一种相对安全的方式是使用命令队列

  • 对象在队列中发布请求(使用信号量)
  • tread检查队列(使用信号量),如果队列已满,则执行最早的请求(您可以 如果您愿意,请介绍优先事项)
  • 如果任务完成,则会向对象发送信号(例如,使用回调函数)
线程通常处于休眠状态,只有醒来时才检查队列。如果无事可做,它会“按下打盹按钮”再次入睡

确保使用信号量保护对队列的访问。否则,数据可能会损坏,您很难找到错误。

我不知道“最佳”是什么,这取决于您的标准。如果您对您的需求做一点扩展,我们可能会提供更具体的帮助。同时

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

许多人轻视使用同步,但这取决于您试图实现的功能。我尽量让事情简单化,直到需求有所不同


如果吞吐量是一个更大的问题,或者如果需要有重叠的请求,则可以使用队列存储请求,对队列的访问权由TCriticalSection控制。您也可以直接使用TThreadList,也可以将其作为您自己的类型化存储的基础—我不知道有一个与TThreadList等价的泛型存储,尽管可能有一个

另一个值得一提的方法是安德烈亚斯·豪斯拉德(Andreas Hausladen)使用的方法。它是一个简单易用且编写良好的线程包装器,在功能环境中运行良好

谢谢你的帮助!我需要使用队列来存储请求,线程在同一时间只能执行一个请求。我无法生成更多使用相同idHTTP的线程,因此即使所有请求都是独立的,它们也必须逐个执行。我正在处理的应用程序在这篇文章中有更多的解释: