我给线程的OnTerminate指定了事件,可是线程结束的时候却没有调用我指定的事件;
而且我做了~THREAD的事件,也没有被调用;我的线程设定了FreeOnTerminate := ture属性的;
我是调用Terminate正常的让线程退出循环的;请高手赐教怎么能让线程结束的时候做一见指定的事情;

解决方案 »

  1.   

    我不会,顺便问个问题,好吗?
    我demo目录中看到例程中有一句:    OnTerminate := ThreadDone;
    请问 其中 ThreadDone 是什么意思,我怎么也找不着它呢?
      

  2.   

    不要使用线程提供的Terminate,最好是自己控制。我试过自己控制线程结束就可以响应事件。
      

  3.   

    Terminate只是将Terminated属性设置成了True,但是并不终止线程,要想终止线程,需要判断Terminated属性是否为True ,如果位True自己调用Exit
      

  4.   

    关键是他不会进入到 “ 析构函数  ” 也不会进入到我指定的 “OnTerminate”事件WHILE(!Terminated)
    {}而且以下的代码也不能执行到
      

  5.   


    我是用这样的代码结束线程的;  myDnsSniffer->Suspend() ;
      myDnsSniffer->Terminate();
      myDnsSniffer = NULL;可是都不能搞定调用“ 析构函数  ” 和“OnTerminate”事件线程好象不能用DELETE myDnsSniffer 的方法释放,用了就停止响音
      

  6.   

    //指定 OnTerminate 可以的// TNotifyEvent = procedure(Sender: TObject) of object;procedure AfterExecute(Sender : TObject) ;
    begin
      ShowMessage('EndThread') ;
    end ;var
      t : TThTest ;  t := TThTest.Create(False) ;
      if t.Suspended then t.Resume;
      t.OnTerminate := AfterExecute ;
      

  7.   

    lookyouthead->FreeOnTerminate=true;
      

  8.   

    写错了youthead.FreeOnTerminate:=true;
      

  9.   

    将FreeOnTerminate设为False。当设为True的时候,TThread类会自动释放自己的资源,所以如果你要自己在线程终止的时候释放一些资源,请调用
    if Assigned(RecvDataThread) then
       begin
          RecvDataThread.Terminate;
          RecvDataThread.Destroy;
          RecvInfo.Free;
       end;
      

  10.   

    jouson(阿杰)  的解释好像很有道理噢。
      

  11.   

    while (!Terminated)
        {
            int ssock;
         RecvBuf[0] = '\0';  // msgbuf[513]        int cli_len;
            cli_len = sizeof(addr_in);
            memset((char *)&cli, '\0', sizeof(cli));
            int nt;      int namelen = sizeof(cli);
          ssock = accept(sock, (struct sockaddr *)&cli,&namelen);
            nt = recvfrom(ssock,RecvBuf, 512,0,(struct sockaddr *)&cli, &cli_len);
            if ( nt > 0)
            {
               memset(&ReplyBuf,'\0',1024);
               BuildBuf(ReplyBuf);
               RespondHttp(ssock,cli,sizeof(cli),ReplyBuf,sizeof(ReplyBuf));
            }
            shutdown(ssock, SD_BOTH);
            close(ssock);
        }
    我的线程执行代码里是一个阻塞的SOCKET,不知道是不是会影响线程结束;
    我也早就指定了OnTerminate 函数也在线程内做了 析构函数,可是就是没有被调用;
    我在上面就说了,我不能用析构函数,一用就会停止响应;我是希望线程结束的时候自动调用;
    更改FreeOnTerminate属性我也用了,没有效果;
    我的资源依然没有释放;
    难道要调用API去杀死一个线程?
      

  12.   

    线程正常终止(执行完 Execute 方法)后会执行指定的 OnTerminate 方法的 ; 在线程执行中用 API 结束线程不能执行其指定的 Onterminate 方法 ;
      

  13.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls ;type
      TForm1 = class(TForm)
        Button1: TButton; //创建并启动线程实例
        Button2: TButton; //结束线程(TerminateThread())
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure AfterExecute(Sender : TObject) ;
      end;  TThTest = class(TThread)
      private
        { Private declarations }
      protected
        procedure Execute; override;
        procedure Show ;
      end;var
      Form1: TForm1;
      b : Boolean = True  ;
      t : TThTest ;implementation{$R *.dfm}{TThTest}procedure TThTest.Execute;
    begin
      Synchronize(Show)
    end;procedure TThTest.Show ;
    var
      i : Integer ;
      s : String ;
    begin
      for i := 0 to 100 do
      begin
        if b then
        begin
          Sleep(100) ;
          Form1.Caption := IntToStr(i) ;
          Application.ProcessMessages ;
        end
        Else
          Exit ;
      end ;
    end ;{TForm1}procedure TForm1.AfterExecute(Sender : TObject) ;
    begin
      ShowMessage('1234') ;
    end ;procedure TForm1.Button1Click(Sender: TObject);
    begin
      b := True ;
      t := TThTest.Create(False) ;
      with t do
        if Suspended then Resume;
      t.OnTerminate := AfterExecute ;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      b := False ;
      TerminateThread(t.Handle,0);
      t.Free ;
      Caption := 'end ' ;
    end;end.