在delphi中使用信号量阻止流式传输类

时间:2015-06-22 12:37:06

标签: delphi streaming semaphore

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以尝试调用OpenSemaphore()大小时间并使用WaitForMultipleObjectsEx()等待所有这些句柄。虽然不确定这是否有效。

更合适的解决方案是通过使用临界区或互锁函数来修改和检查计数,从而维护可用的易失性(线程安全)字节数。 如果使用更高效的互锁功能ABA problem应该被考虑和妥善处理。

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