procedure TmyThread.Execute;
begin
//   inherited execute;
//   freeonterminate:=true;
while true do
    begin
    messagebeep(mb_iconhand);//发出声音
    sleep(1000);
    IF  你想结束       THEN
        BREAK;
    end;
end;
end.

解决方案 »

  1.   

    同意楼上的意见,我再说明一下
    跟一下TThread的源码后发现Terminate函数和Suspend,Resume函数的处理是不同的,Suspend和Resume里都调用了API函数操作线程,而Terminate 里没有!!!
    大概它认为API的TerminateThread函数无法将线程里所有的资源全部释放,
    容易导致内存上的问题,所以把停止线程的工作交给线程本身来处理,
    TThread的Termiante属性其实是让它在Execute 里来判断的:
    procedure TmyThread.Execute ;
    begin
      while true  do
      begin
        //你想做的事情
        ...
        if  terminated  then
          break ;
      end ;
    end ;//附上TThread的几个方法,可以看出差别
    procedure TThread.Suspend;
    begin
      FSuspended := True;
      SuspendThread(FHandle);
    end;
    procedure TThread.Resume;
    begin
      if ResumeThread(FHandle) = 1 then FSuspended := False;
    end;procedure TThread.Terminate;
    begin
      FTerminated := True;
    end;
      

  2.   

    constructor TmyThread.Create(suspended:boolean);
    begin
        inherited Create(Suspended);    resume;  //---------------------加一句end;
    destructor  tmythread.destroy ;
    begin
     //   suspended:=true;
      //  freeonterminate:=true;
        inherited destroy;
    end;
    procedure TmyThread.Execute;
    begin
    //   inherited execute;
    //   freeonterminate:=true;
    while true do
        begin
        messagebeep(mb_iconhand);//发出声音
        sleep(1000);    break;//-------------------结束;    end;
    end;
      

  3.   

    procedure TMyThread.Execute;
    begin
      while not Terminate do
      begin
        MessageBeep(MB_ICONHAND); //发出声音
        Sleep(1000);
      end;
    end;
    // 说明:控制线程何时结束应该是线程本身的工作,这样线程有机会在结束时做一些清理工作。
    //