多线程循环里内存不断增加

hzcenter 2012-03-05 11:04:44
每循环一轮,内存使用大概增加几十k,还有那些资源没有释放?还是方法问题?请教

    while isrun^ do//isrun是一个pboolean,用来控制线程循环
begin
try
perl.Subject:=surl.Get(suri);//perl是正则表达控件,在前面create的,在线程destruct时候销毁了。
perl.RegEx:=srule;
perl.Options:=[preCaseLess];
while perl.MatchAgain do
begin
tmp.Add(perl.SubExpressions[1]);//tmp是tstrings,在循环前创建,在循环结束后销毁了。现在就是怀疑乇鹗tstrings出的问题
tmp.Add(perl.SubExpressions[2]);
end;
except
end;
sLog.Add(tmp.Strings[0] + '#' + tmp.Strings[1]);//FLog消息,详见:http://blog.itpub.net/resource/4034/LogUtils.pas
tmp.Clear;
for i:=0 to 100 do//这里只是想快速响应主窗体发送的退出线程指令
begin
Sleep(stime * 10);
if not isrun^ then
begin
logout:=True;
Break;
end;
end;
if logout then
Break;
end;
...全文
339 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzcenter 2012-03-05
  • 打赏
  • 举报
回复
这个是TPerlRegEx,当匹配不到符合数据,就退出循环了。
这个循环是能退出,现在设置了大概30秒重复执行一次,每执行一次,内存又增加大概112k了。。
[Quote=引用 6 楼 kaikai_kk 的回复:]

引用楼主 hzcenter 的回复:
...
while perl.MatchAgain do
begin
tmp.Add(perl.SubExpressions[1]);//tmp是tstrings,在循环前创建,在循环结束后销毁了。现在就是怀疑乇鹗tstrings出的问题
tmp.Add(perl.SubExpressions[2]);
end;
...



这里是一……
[/Quote]
kaikai_kk 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 hzcenter 的回复:]
...
while perl.MatchAgain do
begin
tmp.Add(perl.SubExpressions[1]);//tmp是tstrings,在循环前创建,在循环结束后销毁了。现在就是怀疑乇鹗tstrings出的问题
tmp.Add(perl.SubExpressions[2]);
end;
...
[/Quote]


这里是一个循环,没有看到有退出循环的代码
hzcenter 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 s11ss 的回复:]

估计这不是重点,重点在sLog.Add(tmp.Strings[0] + '#' + tmp.Strings[1]);中的Strings[0]和Strings[1]有多大
[/Quote]

很小,这串字符长度,不超过30
s11ss 2012-03-05
  • 打赏
  • 举报
回复
估计这不是重点,重点在sLog.Add(tmp.Strings[0] + '#' + tmp.Strings[1]);中的Strings[0]和Strings[1]有多大
hzcenter 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 s11ss 的回复:]

tmp := TStringList.Create;
try
...
finally
tmp.Free
end;
[/Quote]
已有这个,具体是这样:
try
tm:=tstringlist.create;
while .. do
begin
...
end;
finally
tmp.free;
end;

是不是这个tmp要放在循环里面?但是我觉得这样要经常create和free,蛮消耗的。所以才放到循环外面了
s11ss 2012-03-05
  • 打赏
  • 举报
回复
tmp := TStringList.Create;
try
...
finally
tmp.Free
end;
我看见佛 2012-03-05
  • 打赏
  • 举报
回复
看不出来,难道有死循环,,,
一如当初 2012-03-05
  • 打赏
  • 举报
回复
在.dpr文件里加上一句
ReportMemoryLeaksOnShutdown := True;

并把工程改为Debug模式,运行一次就知道问题是不是在这了
还有,你可以用EurekaLog来帮你检测内存泄漏问题
我看见佛 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kiboisme 的回复:]
逐行注释,并测试,
[/Quote]这个方法是绝招啊,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
iamduo 2012-03-05
  • 打赏
  • 举报
回复
线程的东西?
用锁呀。
蓝色光芒 2012-03-05
  • 打赏
  • 举报
回复
逐行注释,并测试,

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧