Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi OmniThreadLibrary内存泄漏';s.ForEach_Delphi_Memory Leaks_Foreach_Parallel Processing_Omnithreadlibrary - Fatal编程技术网

Delphi OmniThreadLibrary内存泄漏';s.ForEach

Delphi OmniThreadLibrary内存泄漏';s.ForEach,delphi,memory-leaks,foreach,parallel-processing,omnithreadlibrary,Delphi,Memory Leaks,Foreach,Parallel Processing,Omnithreadlibrary,我使用OmniThreadLibrary。它有一个并行方法ForEach 我正在处理高负载系统,需要并行处理一些阵列。但是我的内存泄漏了 以下是一个示例: procedure TForm7.FormCreate(Sender: TObject); var loop: IOmniParallelLoop<Integer>; begin while True do begin loop := Parallel.ForEach(1, 100); loo

我使用
OmniThreadLibrary
。它有一个并行方法
ForEach

我正在处理高负载系统,需要并行处理一些阵列。但是我的内存泄漏了

以下是一个示例:


procedure TForm7.FormCreate(Sender: TObject);
var loop: IOmniParallelLoop<Integer>;
begin
  while True do
    begin
      loop := Parallel.ForEach(1, 100);
      loop.Execute(procedure (const i: Integer)
        begin

        end);

       loop := nil;
       Sleep(100);
    end;
end;

过程TForm7.FormCreate(发送方:TObject);
var回路:IOmniParallelLoop;
开始
尽管如此
开始
loop:=并行的ForEach(1100);
执行(过程(常量i:Integer)
开始
(完),;
循环:=nil;
睡眠(100);
结束;
结束
当我运行这段代码时,我可以看到一个虚拟内存泄漏


怎么了?

循环:=nil
看起来很奇怪。你为什么这么做?这段代码不能编译。此外,我还确信,如果不处理真实程序中的任何消息,您不会运行无止境的循环。请给出一个更有意义(且可编译)的示例。@gabr,我已经更新了代码示例。不需要发布真正的程序,因为即使是这个示例也会导致内存泄漏。如果程序退出时未以正常方式释放,则内存泄漏。在你的情况下,程序永远不会退出,所以。。。如果用“for”循环替换此代码,则可能根本没有内存泄漏。最可能的主要原因是,您的程序不处理消息,因此一些内部OTL处理不会发生,并且一些内存没有释放。如果是这样的话,这是故意的。人们会或应该做的事情往往与他们所做的事情相去甚远。例如,此代码不仅锁定了主线程,而且在FormCreate中也锁定了主线程!我建议做一些修改,至少让它看起来像一个真实的示例:1)去掉
while True
循环和
Sleep()
。2) 将代码移动到每100毫秒触发一次的
TTimer
事件中。(循环:=nil
现在是多余的)3)然后您甚至可以添加按钮来启用/禁用窗体中的计时器。