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;