Multithreading 内存泄漏,线程误用?

Multithreading 内存泄漏,线程误用?,multithreading,delphi,memory,Multithreading,Delphi,Memory,我第一次尝试使用线程,但是我不知道为什么我会出现内存泄漏,导致线程误用,或者导致我那么愚蠢,忘记释放一些东西,但是在这一点上,我不知道是哪一个(或者两者都是) 这是单击时调用的过程 procedure TmainForm.scrollFrameClick(item:TEquipmentItem; itemFrame:TitemFrame); begin item.fullImage:=itemFrame.itemImage.Picture.Graphic; setCurrentSearchIte

我第一次尝试使用线程,但是我不知道为什么我会出现内存泄漏,导致线程误用,或者导致我那么愚蠢,忘记释放一些东西,但是在这一点上,我不知道是哪一个(或者两者都是)

这是单击时调用的过程

procedure TmainForm.scrollFrameClick(item:TEquipmentItem; itemFrame:TitemFrame);
begin
item.fullImage:=itemFrame.itemImage.Picture.Graphic;
setCurrentSearchItem(item);
end;
调用线程的过程

procedure TmainForm.setCurrentSearchItem(item:TEquipmentItem);
begin

if not(assigned(searchResultTable)) then
  searchResultTable:=TItemHtmlTable.Create
else
  begin
    freeandnil(searchResultTable);
    searchResultTable:=TItemHtmlTable.Create;
  end;

if getDomTh<>nil then
  if getDomTh.Finished then
    begin
      getDomTh.Terminate;
      getDomTh.WaitFor;
      FreeAndNil(getDomTh);
    end
  else
    begin
      getDomTh.WaitFor;
      getDomTh.Terminate;
      FreeAndNil(getDomTh);
    end;

getDomTh:=TCreateDomThread.Create(false,'http://www.example.com/ru/items/'+inttostr(item.ID),searchResultTable.DomTree);

currentItemImage.Picture.Graphic:=item.fullImage;
itemNameLab.Caption:=item.ItemName;
itemTypeLab.Caption:=item.ItemTypeName;
itemSubtypeLab.Caption:=item.ItemSubtypeName;

/////////////////
// At this point i would call a thread and use the result from the "searchResultTable"
/////////////////

if getDomTh<>nil then
  if getDomTh.Finished then
    freeandnil(searchResultTable)
  else
    begin
      getDomTh.WaitFor;
      getDomTh.Terminate;
      FreeAndNil(getDomTh);
      freeandnil(searchResultTable);
    end;
end;
树检索

 procedure TmainForm.getDomTree(url:string; outputDomTree:TDomTree);
    var
      HtmlTxt: string;
    begin
      try
        HtmlTxt := IdHTTP1.Get(url);
        if not outputDomTree.RootNode.RunParse(HtmlTxt) then
          TThread.Queue(nil,procedure begin showmessage('Can'#39'tParse HTML!') end);
      except
        on E: Exception do
          TThread.Queue(nil,procedure begin ShowMessage(E.ClassName + ' : ' + E.Message); end);
      end;
    end;
如果多次调用单击,taskmanager会显示提交的内存始终在增加。 我没法调试,任何建议都将不胜感激

编辑:

所以有一堆
TDomTree
不是免费的,但我无法理解,从哪里开始,线程被破坏了

编辑2:
找到了错误。

因此我找到了问题<更新ui的线程中引用了
TDomTree
中的code>StringList。因此,当工作线程试图销毁
searchresultable
时,其
TDomTree
StringList
无法终止,从而产生异常,因此整个
TDomTree
没有终止。

您有什么证据表明内存泄漏?(不要相信TaskMan可能会告诉你的内容。)既然我可以点击50次并使用100+mb的ram,我想,我可以称之为泄漏,与内存泄漏无关,但是
setCurrentSearchItem
的前七行可以被
else
分支中的两行单独替换。如果
X
nil
,则执行
X.Free
(因此
FreeAndNil(X)
)是完全安全的。这是因为
X.Free
基本上是
如果分配(X),那么X.Destroy
。好的,谢谢你,请准备一份
 procedure TmainForm.getDomTree(url:string; outputDomTree:TDomTree);
    var
      HtmlTxt: string;
    begin
      try
        HtmlTxt := IdHTTP1.Get(url);
        if not outputDomTree.RootNode.RunParse(HtmlTxt) then
          TThread.Queue(nil,procedure begin showmessage('Can'#39'tParse HTML!') end);
      except
        on E: Exception do
          TThread.Queue(nil,procedure begin ShowMessage(E.ClassName + ' : ' + E.Message); end);
      end;
    end;