文件写入 Class
File Writing Class
我正在考虑创建一个 Class,它使用 TDictionary 或更确切地说 Tstreams 来存储结果,直到它们之间的所有部分都被写入。这样,无论你以何种排列方式添加结果,在输出中,它们都会被排列。好吧,基本上,我试图将进程的输出流存储在内存中,然后将其写入文件流。由于这个过程所花费的时间不同,所以我需要这个 class.
procedure HandleOutput(OutHandle: TObjectDictionary<Integer, TStream>;
Position: Int64; Outstream, mystream2: TStream);
var
NextPosition: Int64;
begin
TMonitor.Enter(OutHandle);
try
if NextPosition = Position then
begin
mystream2.CopyFrom(Outstream, 0);
Inc(NextPosition);
while OutHandle.TryGetValue(NextPosition, Outstream) do
begin
mystream2.CopyFrom(Outstream, 0);
OutHandle.Remove(NextPosition);
Inc(NextPosition);
end;
end
else
OutHandle.Add(Position, Outstream);
finally
TMonitor.Exit(OutHandle);
end;
end;
以上是我的尝试,但看起来确实有效,你能帮我解决这个问题吗?
您的代码访问NextPosition
,但我看不到它在第一次使用之前已初始化。那是 未定义的行为,因为 NextPosition
的值可以是任何东西。这也使得您的 if
条件很可能是 False
并且函数的主要部分永远不会是 运行.
如果要在函数调用之间存储 NextPosition
,则必须将其设为全局变量,或者,在这种情况下,我认为将其设为 [=15= 会更好].但即使那样,您也必须在第一次使用它之前(即在您第一次调用该函数之前)对其进行初始化。
如果您的代码是一个线程的方法,您当然也可以将 NextPosition
设为线程的私有成员。
顺便说一句:
看起来您的 NextPosition
值是连续的。那么使用索引类型(如 TArray<TStream>
或 TList<TStream>
)来存储流会更有意义。这些不必散列和搜索条目,它们是直接访问。如果键是 Integer
和 连续的 TDictionary<Integer, TStream>
似乎不合适。
它的价值:“运行 代码片段”是,据我所知,适用于像 JavaScript 这样的语言(或任何真实名称 - ECMAScript?)可以 运行 在浏览器中。
我正在考虑创建一个 Class,它使用 TDictionary 或更确切地说 Tstreams 来存储结果,直到它们之间的所有部分都被写入。这样,无论你以何种排列方式添加结果,在输出中,它们都会被排列。好吧,基本上,我试图将进程的输出流存储在内存中,然后将其写入文件流。由于这个过程所花费的时间不同,所以我需要这个 class.
procedure HandleOutput(OutHandle: TObjectDictionary<Integer, TStream>;
Position: Int64; Outstream, mystream2: TStream);
var
NextPosition: Int64;
begin
TMonitor.Enter(OutHandle);
try
if NextPosition = Position then
begin
mystream2.CopyFrom(Outstream, 0);
Inc(NextPosition);
while OutHandle.TryGetValue(NextPosition, Outstream) do
begin
mystream2.CopyFrom(Outstream, 0);
OutHandle.Remove(NextPosition);
Inc(NextPosition);
end;
end
else
OutHandle.Add(Position, Outstream);
finally
TMonitor.Exit(OutHandle);
end;
end;
以上是我的尝试,但看起来确实有效,你能帮我解决这个问题吗?
您的代码访问NextPosition
,但我看不到它在第一次使用之前已初始化。那是 未定义的行为,因为 NextPosition
的值可以是任何东西。这也使得您的 if
条件很可能是 False
并且函数的主要部分永远不会是 运行.
如果要在函数调用之间存储 NextPosition
,则必须将其设为全局变量,或者,在这种情况下,我认为将其设为 [=15= 会更好].但即使那样,您也必须在第一次使用它之前(即在您第一次调用该函数之前)对其进行初始化。
如果您的代码是一个线程的方法,您当然也可以将 NextPosition
设为线程的私有成员。
顺便说一句:
看起来您的 NextPosition
值是连续的。那么使用索引类型(如 TArray<TStream>
或 TList<TStream>
)来存储流会更有意义。这些不必散列和搜索条目,它们是直接访问。如果键是 Integer
和 连续的 TDictionary<Integer, TStream>
似乎不合适。
它的价值:“运行 代码片段”是,据我所知,适用于像 JavaScript 这样的语言(或任何真实名称 - ECMAScript?)可以 运行 在浏览器中。