初学多线程编程,用TThread.主程序退出的时候,这些线程可以正常退出,但是我想这些线程执行完毕就自动退出.
在debug的时候,只看到Thread start:Thread ID:xxxx.没有看到Thread Exit.procedure TProcess.Execute;
var
i:integer;
begin
  FreeOnTerminate :=true;
  for i:=0 to 10 do
  begin
    if not Terminated then     
    checkDate();//执行函数
  end;
  form1.Memo1.Lines.Add('线程执行完毕!');//有正常输出执行完毕.
//  Terminate;//添加Terminate也不行
end;请问怎样才能,循环执行checkDate之后退出线程呢.

解决方案 »

  1.   

    没问题的阿,正确执行,如果不行的话,那就检查下checkDate的代码
    type
      TProcess = class(TThread)
      protected
        procedure Execute; override;
        procedure checkDate;
      public
        destructor Destroy; override;
      end;procedure TProcess.checkDate;
    begin
      Form1.Memo1.Lines.Add('checkDate');
    end;destructor TProcess.Destroy;
    begin
      inherited;
      Form1.Memo1.Lines.Add('Destroy');
    end;procedure TProcess.Execute;
    var
      i:integer;
    begin
      FreeOnTerminate :=true;
      for i:=0 to 10 do
      begin
        if not Terminated then
          checkDate();//执行函数
      end;
    end;
      

  2.   

    原来我的Destroy用了,Terminate和WaitFor.所以线程没有结束.去掉就OK.之前看到一遍文章说如果没有这两个,主线程退出会内存溢出.怎样解决呢?destructor TProcess.Destroy;
    begin
      inherited;
      Form1.Memo1.Lines.Add('Destroy');
      WaitExecute;
    end;
    procedure TProcess.WaitExecute;
    begin
      Terminate;
      WaitFor;
    end;
      

  3.   


      FreeOnTerminate :=true; // 设置这个,就是让线程Execute结束后自动调用Destroy,所以不用在Destroy中等待Execute结束,找书看
      

  4.   

    如果没有设置  FreeOnTerminate ,在调用线程的Free时候,vcl帮你做了会判断当前线程有没有结束,而不需要自己调用 Terminate; WaitFor; 看TThread的源代码:
    destructor TThread.Destroy;
    begin
      if not FFinished and not Suspended then
      begin
        Terminate;
        WaitFor;
      end;
      if FHandle <> 0 then CloseHandle(FHandle);
      inherited Destroy;
      RemoveThread;
    end;