如果你的线程干完了自己的事情可以向主线程发个消息,用SendMessage
如果想强行关闭可以用TerminateThread

解决方案 »

  1.   

    if not mythread.Terminated then
      mythread.Terminate;
      

  2.   


      if not mythread.Terminated then
      mythread.Terminate;
             
     
     根本就编译不过
      

  3.   

    最好不要用D6在带的线程对象,tmd好多问题
      

  4.   

    呵呵,你的线程里有没有消息循环?有就给它发个退出消息呗,没有的话,可调用线程的Terminate方法,呵呵,最绝的方法就是调用API函数TerminateThread()不过,这种方法是下下之策,不建议使用! 最好还是用Terminate方法
      

  5.   

    用terminate在线程外能使用吗??
    我是想在窗口的关闭事件中判断线程是否在执行如果还在执行则结束..
      

  6.   

    呵呵,可以呀,不过你要在外面保存线程对象才行,即在建立线程对象时,将新建的线程对象的指针保存起来(要是类成员变量或全局变量),然后你才能在OnClose事件中能过线程对象的指针调用它的Terminate方法,如for i := 0 to MyThreadCount do
    begin
      if (mythread[i] <> nil) and  (not mythread[i].Terminated) then
      begin
        mythread[i].Terminate;
        FreeAndNil(mythread[i]);
      end;
    end;MyThreadCount,和mythread数组都就在类成员,在建立线程时将线程对象的指针保存到mythread数组,用MyThreadCount记录线程的个数要注意线程对象的FreeOnTerminate应为False,否则这样写可能是会出异常的
      

  7.   

    呵呵,错了,应是
    for i := 0 to MyThreadCount-1 do.........
      

  8.   

    我是用的delphi自带的那个线程呀..
    那到那去找线程对像....
    ??
      

  9.   

    用API最简单
    function ThreadProc(Parameter: Pointer): Integer; stdcall;
    begin
      // thread loop;
      //从thread loop退出后,线程就完了,简单吧。:)
    end;buttononlick
    var
      ThreadID: DWORD;
      ThreadHandle: THandle;
    begin
      //参数不知打对没
      ThreadHandle := CreateThread(nil, 0, @ThreadProc, nil, ThreadID);
      //ThreadHandle没有用到,所以关了它
      CloseHandle(ThreadHandle);
    end;
      

  10.   

    我是想知道线程正在执行的过程中,还没有结束的时候如果关闭掉程序..则怎么来关闭掉正在执行的线程..
    还有我用的是delphi自带的thread对象..
      

  11.   

    看你的thread.Execute是怎么写的,
    一般来说在那里都是
    procedure TMyThread.Execute;
    begin
      while not Terminated and (你程序用的条件) do
      // loop
    end;这样做一般用thread.teminiate可以中止的,
    不过就怕你的loop中又有一个loop,又一个waitfor,那么thread.terminiate就没什么用了。
      

  12.   

    不是呀我在线程是是可以中止的..
    可是当我的线程没有终止时,有人直接就关闭程序就会出现异常了所以我想在close事件中能判断一下如果线程在执行则关闭..
      

  13.   

    在关闭窗体时设置线程的TERMINATED为TRUE
      

  14.   

    没法设置...
    我的线程名字叫sockthread语句这样编译也不过:sockthread.terminated:=true;
      

  15.   

    呵呵,就是因为你用的Delphi的线程,我才说线程对象呀!!
    如:
    var
      aThread: TMyThread;
    aThread := TMyThread.Create(.......0;aThread就是线程对象呀,它是TMyThread类的对象,或者,就类的实例更贴切一点吧!  可参考面向对象的相关理论! 
    另外, aThread实际上是个指针,所以有时也叫对象指针!你保存了线程对象后,就可随时对线程对象做任何操作了!
      

  16.   

    TO: weizhi(行者) 
    你太聪明了
    谢谢^_^