请教一个线程释放的问题(50分)

  • 主题发起人 demogorgon
  • 开始时间
D

demogorgon

Unregistered / Unconfirmed
GUEST, unregistred user!
写了一个TAlarmThread线程
procedure TAlarmThread.Execute;
begin
while not Terminateddo
begin

synchronize(Self.GetAlarm);//一个从数据库查询的操作,需要占用较长的时间
sleep(5000);
//WaitForSingleObject(hVar, INFINITE);
end;
end;

在表单创建的时候创建线程
procedure TMainWin.FormShow(Sender: TObject);
var
th := TAlarmThread.Create(false);//th为全局变量,th:TAlarmThread
end;

在表单关闭的时候释放线程
procedure TMainWin.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if th <> nil then
begin
th.Terminate;
if th.Suspended then
th.Resume;
th.WaitFor;
th.Free;
th := nil;
end;
end;

但是每次关闭表单都要等待好长一段时间才能关闭,我应该怎么处理?
是不是哪里写得有问题?
 
to demogorgon:
这样试试。
procedure TMainWin.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
th.Terminate;
th.destroy;
end;
 
这样做安全吗?如果线程执行还没有结束怎么办?
 
我调试了一把,发现在th.Destroy这句的时间很长,如果用我原来的语句,则主要时间
都花在th.WaitFor上了,有什么好办法可以避免等待?
 
如果能保证数据安全,可以考虑用win32 api
TerminateThread(th.handle,1) 结束线程。
 
为什么我用TerminateThread(th.handle,1)结束进程,虽然没有报错,执行也很快,
但是我的主窗口就死在那儿了,
btw:这个线程是负责从数据库中统计数据,然后显示在主窗口的TListBox上的。
while not Terminateddo
begin

synchronize(Self.GetAlarm);//往主窗口写
sleep(5000);
end;
 
TerminateThread 当然快了,他好像是强制结束的吧,别用
之所以慢,是因为你的 sleep(5000),因此无论如何都会先
等待 5 秒,然后才有机会判断 not Terminated 然后退出。
将 5000 改小,这样可以减少相应时间。
至于你的 GetAlarm 需要长时间的问题,可以变相解决,加
个判断,如果 GetAlarm 结束则设定一个标志,如果在循环
里面检测出标志位,则执行,好像这个样子:
while not Terminateddo
begin

if SomeSignal then
synchronize(Self.GetAlarm);
sleep(100);
// 此处调小
SomeSignal := False;
end;
 
多人接受答案了。
 

Similar threads

Q
回复
4
查看
298
穿越沦陷的爱
穿
W
回复
2
查看
222
lp414
L
A
回复
20
查看
909
Andy_chen
A
顶部