如果在程序种创建了多个线程,线程启动后,可以看到每个线程执行正常。
可是按下结束按钮后,程序死在那里。结束按钮语句如下,调试断点,好像是执行Setthread.Waitfor时死了。如果创建的线程只有一个,则不会死。很奇怪,请各位给分析分析。procedure TForm1.StopThread(); //
var
i:word;
RV:LongWord;
begin
//sleep(100);
if Setthread<>nil then
begin
Setthread.Terminate;
Setthread.Waitfor;
FreeAndNil(Setthread);
end;
end;
可是按下结束按钮后,程序死在那里。结束按钮语句如下,调试断点,好像是执行Setthread.Waitfor时死了。如果创建的线程只有一个,则不会死。很奇怪,请各位给分析分析。procedure TForm1.StopThread(); //
var
i:word;
RV:LongWord;
begin
//sleep(100);
if Setthread<>nil then
begin
Setthread.Terminate;
Setthread.Waitfor;
FreeAndNil(Setthread);
end;
end;
Setthread.Free;线程中判断if terminated then exit; //结束线程
Setthread.Free;
-------------------
这样是应该行的
freeonterminater:=True;
!
我看还是按楼上的方法,创建线程的时候设置 FreeOnTerminate := True; 吧,就不用 FreeAndNil(Setthread); 了,在 Setthread.OnTerminated 事件里面指定 Sender := nil;
将线程里的参数都以类的形式封装起来,在主进程里结束前把那个类一释放,线程就会有异常。在线程里做个try...except,在异常处理时结束线程,速度超快。
线程里最好少用sleep(比较大的数),这样在主进程退出时容造成线程无法返回还死掉。
非要Sleep的话可以这样写
var
pTime: DWord;
begin
pTime := GetTickCount;
while GetTickCount - pTime < FInterval do
begin
if Terminated then
Exit;
sleep(1);
end;