【发布时间】: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