写一个定义与myThread的OnTerminate事件一样的过程:myThreadTerminate,
在myThread[i]:=TmyThread.Create后,用这句:
myThread[i].OnTerminate := myThreadTerminate;for i:=0 to threadcount do
begin
  mythread[i]:=tmythread.create;
  myThread[i].OnTerminate := myThreadTerminate;
end;

解决方案 »

  1.   

    用不着事件
    在线程的execute
    第一行插一句
    freeOnTerminate := true;
    在最后一行在补上一句
    Form1.变量 :=  Form1.变量 + 1;
      

  2.   

    TMyThread = class(TThread)
      private
        HandleFrm : integer;
        step : integer;
      public
        constructor Create(handle:integer);
        procedure Execute; override; end;
    constructor TMyThread.Create(handle:integer);
    begin
      HandleFrm := handle;
      FreeOnTerminate := True;
      inherited Create(false);
    end;
    procedure TMyThread.Execute;
    var
      i : integer;
    begin
      inherited;
      for i:= 0 to 10000 do
      begin
          step := i;
          if step = 5000 then
          begin
            SendMessage(HanldeFrm,WM_SYSCOMMAND,SC_MINIMIZE,0);
            //满足条件时发送消息,可以自己定制消息,然后在对应的文件实现消息处理函数
            exit;//当然不一定退出;
          end;
        do sth;
      end;
    ///////////////////////////////////////////////////////////////////////////
    关于Form1的定义;
      private
        { Private declarations }
        ThreadCount : integer;
        procedure ThreadDone(Sender: TObject);
    .......
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i : integer;
    begin
      for i:=0  to ThreadCount - 1 do
      begin
        with TMythread.Create(Form1.handle) do
          OnTerminate := ThreadDone;
    end;
    procedure TForm1.ThreadDone(Sender :TObject);
    begin
      Dec(ThreadCount);
      if (ThreadCount = 0) then
        ShowMessage('All Threads have been done!');
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ThreadCount := 20;
    end;
    希望对你有所帮助!!!!
      

  3.   

    最好不要分配数组,用TList动态维护。type 
      TMyThread = class(TThread)
      private
       FEvent: THandle;
      public
       constructor Create(Run: Boolean); override;
       destructor Destroy; overrdie;
       property Event: THandle read FEvent;
      end;constructor TMyThread.Create(Run: Boolean); 
    begin
      FEvent := CreateSemaphore(nil, 1);
      inherited Create(Run);  
    end;destructor TMyThread.Destroy;
    begin
      CloseHandle(FEvent);
    end;procedure TMyThread.Execute;
    begin
      //初始工作...
      //初始完成了,通知Form1我进行线程循环了。Form1主线程可以继续工作了
      ReleaseSemaphore(FEvent, 1);
      //循环
    end;
    procedure TForm1.ThreadTerminate(Sender: TObject);
    begin
      //当每个线程完成Free时,触发这个事件。
      Dec(FCount);
    end;procedure TForm1.CreateMyThread;
    var
      Thread: TMyThread;
    begin
      Thread := TMyThread.Create(True);
      Thread.OnTerminate := ThreadTerminate;
      WaitForSingleObject(Thread.Event, 10000);  //等Thread进行循环
      FThreadList.Add(Thread); 
      Inc(FCount);
    end;   procedure Button1.onclick
    begin
      for I := 0 to ThreadCount do
        CreateThread;
    end;FCount: Integer其时没必要了,可以通过访问FThreadList.Count来知道多少个线程了。记住Free FThreadList所指的线程资源。
    FThreadList: TList//指向TMyThreadprocedure FreeThread;
    var I: Integer;
    begin
      for I:= 0 to FThreadList.Count - 1 do
      begin
        TMyThread(FThreadList[i]).Terminate;    
        TMyThread(FThreadLIst[I]).Free;
      end;
      FThreadList.Free;
    end;