文件写入 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?)可以 运行 在浏览器中。