【问题标题】:delphi read from TMemorystream without position changedelphi 从 TMemorystream 读取而不改变位置
【发布时间】:2019-10-05 05:56:08
【问题描述】:

我有一个从进程填充的 TMemory 流,我需要实时读取它的另一部分。当我使用此代码时:

for i := 0 to j do
begin
    FOutputStream.position:=i * 194
    stream4.CopyFrom(FOutputStream,   194 );
end;

它返回错误的数据,因为写入进程改变了位置。 所以我决定使用 Memory 属性

stream4.CopyFrom( PByte(FOutputStream.Memory)[ i * 194 ] , 194) );

但我得到了这个错误

[DCC 错误] Unit1.pas(640): E2010 不兼容的类型:'TStream' 和 '字节'

我该如何处理这个错误?

【问题讨论】:

  • Writer 进程也可以改变内存位置,这样你就拥有了 AV。您应该使用 Mutex 或其他同步原语来保护读写器之间的共享资源 (TMemoryStream)。
  • @zed 是 TMemoryStream.position 和 TMemoryStream.memory 有一个指针吗?我的意思是如果我改变位置,那么内存也会改变,或者两者都必须单独设置??!
  • “Filled from a progress”是指“进程”还是“线程”?
  • 不,位置和内存是不同的东西,但是它们都可以被Writer改变。
  • 好吧,那么你真的需要像@zed 所说的那样,对资源进行线程安全访问。创建一个“mutex”或“criticalsection”或者可能是“tmrewsync”,以确保在您从中读取数据时无法修改流。注意:这必须从阅读和写作线程中完成!

标签: delphi


【解决方案1】:

在这种情况下,您不能直接使用CopyFrom,因为这需要一个流,并且您有一个指针。

您可以通过创建一个包含另一个内存流拥有的内存的流对象来解决这个问题。然而,这是不必要的复杂。您只需拨打WriteBuffer即可。

stream4.WriteBuffer(PByte(FOutputStream.Memory)[i * 194] , 194);

我想您知道这一点,但是由于您在读取和写入内存流时从不同的线程进行操作,因此您需要确保这些操作能够解决任何潜在的线程安全问题。

【讨论】:

  • 这是写在指针位置还是写在流的末尾!?
  • 流写入从当前位置开始。如果它没有流式传输将有点没用。
  • 有没有办法在不改变指针位置的情况下将新字节追加到流的末尾?
  • 当然。记下当前位置。寻求到底。写入数据。然后寻回原来的位置。
猜你喜欢
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多