{==========================================================================}
我把线程类放在另一个单元文件中
constructor TCalScoreThread.Create(createSuspended: boolean; obj: TRna);
begin
freeOnTerminate:=true;
inherited create(createSuspended);
end;procedure TCalScoreThread.Execute;              //在线程中进行计算序列分数
begin
  { Place thread code here }
  TRna.calScore;
end;
{==========================================================================}
// 另一个单元中使用线程类
procedure TUseTh.ThreadCal;       //开始线程
begin
 calThread:=TCalScoreThread.Create(false,self);      //创建线程对象,马上执行
 calThread.OnTerminate:=OnCaled;         //结束线程时触发事件  
end;TUseTh.AbortTh          //终止线程
begin
 calThread.Terminate;    //终止线程 
end;
{==========================================================================}可是我发现我调用 TUseTh.AbortTh  后,线程还是继续着?
如何终止线程? 不是用Termainate吗?谢谢

解决方案 »

  1.   

    好像没有什么问题,结束的时候加上这个:
    TUseTh.AbortTh          //终止线程
    begin
      if calThread <> nil then
        calThread.Terminate;    //终止线程 
    end;
      

  2.   

    应该没问题
    不过这句话,,,会不会...
    calThread.OnTerminate:=OnCaled;         //结束线程时触发事件
      

  3.   

    应该是楼上提到的问题,可以使用beginThread,其函数执行完就会释放,
    或者用派生类的execute
      

  4.   

    constructor TCalScoreThread.Create(createSuspended: boolean; obj: TRna);
    begin
    inherited create(createSuspended);
    freeOnTerminate:=true; //放在上面不好吧。还是放在下面看着舒服。
    end;
      

  5.   

    用这个布尔型的属性试下看Terminated
      

  6.   

    楼上的都不是正解!
    线程的Terminate过程其实只是对线程作了一个标志量,对线程正在处理的事情并没有影响!
    要让线程在Terminate后立即停掉,只能在execute方法中不停的判断是否Terminated。
    估计楼主的线程在TRna.calScore过程中花耗时间较长,但该过程中并没有判断是否Terminated,所以线程还是自己干自己的事儿
      

  7.   

    楼上的才是正解!
    要强制关闭就用TerminateThread这个API