procedure TFrm_Main.FormDestroy(Sender: TObject);
begin
  WideLookThread.Terminate;
  WideLookThread.Free;
  WideLookThread := nil;
end;程序退出后,Delphi的调试窗体还是在Running状态,这是为什么???
谢谢了

解决方案 »

  1.   

    主程序退出了,还用FREE干吗。人家指的是在程序运行中控制线程的创建和释放。
    好像释放先得用Destroy方法吧。  WideLookThread.Terminate;
      WideLookThread.Destroy;
      WideLookThread.Free;
      WideLookThread := nil;你在试试。
      

  2.   

    procedure TFrm_Main.FormDestroy(Sender: TObject);
    begin
      WideLookThread.Terminate;
      WideLookThread.WaitFor; // 看看你的线程能不能结束
      WideLookThread.Free;
    end;
      

  3.   

    照楼上得说得做了
    还是不结束呀
    procedure TWideLook.Execute;
    begin
      FreeOnTerminate := true;
      if LookInBelt then
        Application.MessageBox('该问题有解!', '提示', MB_ICONINFORMATION)
      else
        Application.MessageBox('很遗憾,该问题没有结果!', '提示', MB_ICONINFORMATION);
    end;
    这是我的线程
      

  4.   

    procedure TFrm_Main.FormDestroy(Sender: TObject);
    begin
      WideLookThread.Terminate;
      WideLookThread.WaitFor; 
      WideLookThread.Destory;
    end;
    这样试试呢
      

  5.   

    Terminate的时候只是发送信号,并没有结束线程的
    OnExecute中必须检查Terminated属性,只有OnExecute方法结束了,才会Terminate的所以必须
    while not Terminated do ...
    才能保证Terminate方法的有效
      

  6.   

    我也遇到同样的问题 
    如果只用 menu.terminate; 退出过后不会报错
    但是只要加上 menu.waitfor; 就会报错
    报错内容如下:
      exceplion class EOSError with message'System Error. Code:6. 句柄无效
      

  7.   

    LookInBelt 是什么意思?
    是不是一个检测同步信号的过程?那么可能是 LookInBelt 无法返回。
    把 LookInBelt 帖出来看看。
      

  8.   

    procedure TFrm_Main.FormDestroy(Sender: TObject);
    是不是没触发这个事件?(俺是菜鸟别笑俺)
      

  9.   

    在线程中添加一个公开的属性
    property IsEnd:boolean read FIsEnd write FIsEnd;
    在线程的主循环中判断是否需要退出
    while true do
    begin
      if FIsEnd then
        break;
      ...
    end;在结束线程时
      WideLookThread.IsEnd := true  
      WideLookThread.WaitFor; 
      WideLookThread.Free;
      WideLookThread := nil;
      

  10.   

    to ly_liuyang(Liu Yang)
    你说得while not Terminated do
    在什么地方加?
    我试试gxd0001得方法是否有效
      

  11.   

    function LookInBelt: boolean;//循环的读取链表查询每个可能的值 true:找到了 false: 没有找到;
    var
      p: PDataRec;
    begin
      Result := false;
      p := H_Data;
      while p <> nil do
      begin
        if p^.sign = 1 then
        begin
          p^.sign := 0;
          if WideLook(p^.Data) then
          begin
            Result := true;
            exit;
          end;
        end;
        p := p^.Next;
      end;
    end;
    //这个函数就是查询链表里面得值,没有特殊得意思
      

  12.   

    我在LookInBelt里改了一下,可以结束线程了,但是
    function LookInBelt: boolean;//循环的读取链表查询每个可能的值 true:找到了  false: 没有找到;
    var
      p: PDataRec;
    begin
      Result := false;
      p := H_Data;
      while p <> nil do
      begin
        if WideLookThread.IsEnd then   //这里加了一个判断
        begin
          Result := false;
          break;
        end;
        if p^.sign = 1 then
        begin
          p^.sign := 0;
          if WideLook(p^.Data) then
          begin
            Result := true;
            exit;
          end;
        end;
        p := p^.Next;
      end;
    end;可是在窗体结束时,却提示线程句柄无效,这是什么错误
    procedure TFrm_Main.FormDestroy(Sender: TObject);
    begin
      if WideLookThread = nil then
        exit;
      WideLookThread.IsEnd := true;
      WideLookThread.Terminate;
      WideLookThread.Destroy;
      //WideLookThread.WaitFor;
      WideLookThread.Free;
      WideLookThread := nil;
    end;
      

  13.   

    因为你的 FreeOnTerminate=True
    所以下面两句不再需要。另外,下面两行只能任选其一,不可都执行。
      WideLookThread.Destroy;
      WideLookThread.Free;