delphi中带信号量的阻塞流类

delphi中带信号量的阻塞流类,delphi,streaming,semaphore,Delphi,Streaming,Semaphore,我正在用delphi编写一个用于阻止数据流的类。该类有两个方法来读取和写入流。方法“写入”将向缓冲区中添加新数据,方法“读取”将从缓冲区中弹出一些数据: TBlockingStream = class public function Write(const data; size: Integer): Integer; function Read(var data; size: Integer): Integer; ... end; 每次我们在流中写入/读取新数据时,输入和输出数据的

我正在用delphi编写一个用于阻止数据流的类。该类有两个方法来读取和写入流。方法“写入”将向缓冲区中添加新数据,方法“读取”将从缓冲区中弹出一些数据:

TBlockingStream = class
public
  function Write(const data; size: Integer): Integer;
  function Read(var data; size: Integer): Integer;
  ...
end;

每次我们在流中写入/读取新数据时,输入和输出数据的大小都会发生变化。我希望方法“read”等待方法“write”提供请求的大小。使用信号量进行同步,在方法“write”中,我释放信号量(ReleaseSemaphore函数)和写入缓冲区的字节数,但在方法“read”中,我不知道如何等待方法“read”中请求的字节数?

您可以尝试调用OpenSemaphore()Size times并使用WaitForMultipleObjectsEx()等待所有这些句柄。尽管不确定这是否会奏效

更合适的解决方案是通过使用临界段或联锁函数来修改和检查字节数,从而保持可用的易失性(线程安全)字节数。 在使用时,应考虑并正确处理更有效的联锁功能


为了避免在Read()中出现不必要的循环,可以使用TEvent。

您可能想看看这是一个
TThreadedQueue
示例,如果用作基础和扩展UPU,它可能满足您的需要。我怀疑写入字节的信号量计数是最好的解决方案。@jasperschellinger但我不理解TThreadedQueue示例,但是使用两个TMonitor对象的想法是useful@David最后,我用两个Critical Section对象解决了这个问题,但我不知道是否存在在两个线程中计算字节的简单解决方案。@Jasperschellinger没有一个Critical Section对象来访问AvailableSize和RequestedSize变量,如果需要,另一个对象将等待数据可用。