delphi 不断创建线程,销毁线程,程序占用线程却不断增加,有没有朋友遇到并解决问题?

Fangyuanshan 2015-10-11 06:15:21
之前在一个复杂的软件发现这个问题,后来专门编写了一个非常简单的例子,这个问题却存在,不知道如何解决。我用fastmm进行内存泄漏检查 ,没有发现可疑的内存泄漏,不知道有没有朋友知道如何解决这个问题?我的代码很简单
1,创建一个TThread对象,这个线程经过短暂的延时后退出,代码如下
constructor TTcpCmdThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
end;

destructor TTcpCmdThread.Destroy;
begin

inherited;
end;

procedure TTcpCmdThread.Execute;
var
i:Integer;
begin
{ Place thread code here }
//self.FreeOnTerminate := True;
i:=0;
while(True)do
begin
Inc(i);sleep(1);
if i > 20 then Break;
end;

end;

2、主窗口用一个定时器定时创建新的线程,并在线程结束后销毁;
procedure TForm1.playcmd;
begin
FTcpCmdThread:=TTcpCmdThread.Create(true);
FTcpCmdThread.Resume;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
ret:Integer;
begin

if(fstatus = 0)then
begin
if(ftcpcmdthread = nil)then
begin
playcmd();
fstatus := 1;
end;
end
else if fstatus = 1 then
begin
ftcpcmdthread.WaitFor;
ftcpcmdthread.Free;
ftcpcmdthread:=nil;
fstatus:=0;
Inc(fcount);
label1.Caption := IntToStr(fcount);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
fstatus := 0;
fcount := 0;
end;

...全文
687 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fangyuanshan 2015-10-16
  • 打赏
  • 举报
回复
多谢各位朋友关心,问题已经找到并解决了。我在modules中发现有几个与程序无关的加载项,包括NVIDIA Corporation\coprocmanager目下的三个动态库,当我禁止NV的三个动态库后,恢复正常了。
Fangyuanshan 2015-10-12
  • 打赏
  • 举报
回复
纠正:
在4#的描述中,“因此是死锁导致的资源无法释放”应该是“因此不是死锁导致的资源无法释放”
Fangyuanshan 2015-10-12
  • 打赏
  • 举报
回复
回复2#
在ide调试过程,可以看到程序正常的进入thead.create,和正常的进入thread.destroy,因此是死锁导致的资源无法释放,另外,在线程内用FreeOnTerminate=true也会出现同样的现象。

今早我用同样的程序在xp,win7 32,win7 64 上试了下,发现这个现象只会在我的电脑上发生,在其他电脑上,从任务管理器可以看到程序占用的内存几乎不变的,我开始有些怀疑是否是我电脑中某个第三方插件引起的这个问题,因为在ide的module调试窗口记录了程序运行加载了taobaoportectse.dll(淘宝),ksfmon.dll(金山),kwsui(金山).dll,nvdxgiwrap.dll(nv显卡)等模块。
Fangyuanshan 2015-10-12
  • 打赏
  • 举报
回复
回复1#
这个是打字错误,应该是“程序占用的内存却不断增加”
lyhoo163 2015-10-12
  • 打赏
  • 举报
回复
  ftcpcmdthread.WaitFor;
ftcpcmdthread.Free;
ftcpcmdthread:=nil;


这段代码在主线程调用WaitFor方法。此时线程要在Handle数组中增加一个SyncEvent,然后循环等待,直到线程结束。此处出现死锁了,不再执行释放,造成内存大量被占用。
个人意见,仅代参考。




lyhoo163 2015-10-12
  • 打赏
  • 举报
回复
依据你的代码,还原后。Win7 32位下运行下,跟踪代码 status 在0,1之间不断切换。

  if (fstatus = 0) then
begin
if (ftcpcmdthread = nil) then
begin
playcmd();
fstatus := 1;
end;
end
else
if fstatus = 1 then
begin
ftcpcmdthread.WaitFor;
ftcpcmdthread.Free;
ftcpcmdthread:=nil;
fstatus:=0;
Inc(fcount);
label1.Caption := IntToStr(fcount);
end;

未见内存无序增加。
  • 打赏
  • 举报
回复
我这边并没有什么问题啊!
pathletboy 2015-10-11
  • 打赏
  • 举报
回复
“程序占用线程却不断增加”这句看不明白,请解释下。

16,747

社区成员

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

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