我正在考虑创建一个使用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;
以上是我尝试做的事情,但看起来似乎很有效,请你帮帮我吗?
答案 0 :(得分:1)
您的代码访问NextPosition
,但我无法看到它在第一次使用之前已初始化。那是未定义的行为,因为NextPosition
的值可以是任何值。这也使得if
条件很可能是False
,并且函数的主要部分永远不会运行。
如果你想在函数调用之间存储NextPosition
,你必须使它成为一个全局变量,或者,在这种情况下,我认为如果你使它变为{{1}会更好}。但即使这样,您也必须在第一次使用它之前(即在您第一次调用该函数之前)对其进行初始化。
如果你的代码是一个线程的方法,你当然可以让threadvar
成为你线程的私有成员。
看起来NextPosition
的值是连续的。然后,使用索引类型(如NextPosition
或TArray<TStream>
)来存储流将更有意义。这些不必哈希并搜索条目,它们是直接访问。如果密钥TList<TStream>
且连续连续,则TDictionary<Integer, TStream>
似乎不合适。
了解它的价值:&#34;运行代码段&#34;是,AFAIK,意味着可以在浏览器中运行的JavaScript(或任何真实名称 - ECMAScript?)等语言。