文件写作课

时间:2016-07-27 17:32:21

标签: delphi delphi-2010

我正在考虑创建一个使用TDictionary来存储结果的类,或者更确切地说是Tstream,直到写完所有部分。这样,无论您在哪种布置中添加结果,在输出中都会排列所有结果。好吧,基本上,我正在尝试将进程的输出流存储在内存中,然后将其写入文件流。由于该过程所花费的时间不同,所以我需要这个课程。

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;

以上是我尝试做的事情,但看起来似乎很有效,请你帮帮我吗?

1 个答案:

答案 0 :(得分:1)

您的代码访问NextPosition,但我无法看到它在第一次使用之前已初始化。那是未定义的行为,因为NextPosition的值可以是任何值。这也使得if条件很可能是False,并且函数的主要部分永远不会运行。

如果你想在函数调用之间存储NextPosition,你必须使它成为一个全局变量,或者,在这种情况下,我认为如果你使它变为{{1}会更好}。但即使这样,您也必须在第一次使用它之前(即在您第一次调用该函数之前)对其进行初始化。

如果你的代码是一个线程的方法,你当然可以让threadvar成为你线程的私有成员。

顺便说一下:

看起来NextPosition的值是连续的。然后,使用索引类型(如NextPositionTArray<TStream>)来存储流将更有意义。这些不必哈希并搜索条目,它们是直接访问。如果密钥TList<TStream> 连续连续,则TDictionary<Integer, TStream>似乎不合适。

了解它的价值:&#34;运行代码段&#34;是,AFAIK,意味着可以在浏览器中运行的JavaScript(或任何真实名称 - ECMAScript?)等语言。