如果在程序种创建了多个线程,线程启动后,可以看到每个线程执行正常。
可是按下结束按钮后,程序死在那里。结束按钮语句如下,调试断点,好像是执行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;

解决方案 »

  1.   

    我也才看几天看这样行不行Setthread.Terminate;
    Setthread.Free;线程中判断if terminated then exit; //结束线程
      

  2.   

    Setthread.Terminate;
    Setthread.Free;
    -------------------
    这样是应该行的
    freeonterminater:=True;
      

  3.   

    因为线程任务比较重,Terminate之后不能立刻Free掉,所以加了waitfor.但是会死掉。不知是何原因
      

  4.   

    你的线程函数中有没有判断TERMINATED,否则肯定是要死了!要是判断了,去掉那个WIATFOR ,就好了
      

  5.   

    我没有用过WaitFor,所以不清楚。
    我看还是按楼上的方法,创建线程的时候设置 FreeOnTerminate := True; 吧,就不用 FreeAndNil(Setthread); 了,在 Setthread.OnTerminated 事件里面指定 Sender := nil;
      

  6.   

    我偶而的方法。
    将线程里的参数都以类的形式封装起来,在主进程里结束前把那个类一释放,线程就会有异常。在线程里做个try...except,在异常处理时结束线程,速度超快。
    线程里最好少用sleep(比较大的数),这样在主进程退出时容造成线程无法返回还死掉。
    非要Sleep的话可以这样写
    var
      pTime: DWord;
    begin
      pTime := GetTickCount;
      while GetTickCount - pTime < FInterval do
      begin
        if Terminated then
          Exit;
        sleep(1);
      end;