if mythread.suspended then
  mythread.resume;但在线程中设置断点,发现线程并未被重新启动;
改成直接mythread.resume;就正确了。但我不知没有被暂停的线程,执行resume会不会导致问题?

解决方案 »

  1.   

    VOID ExitThread( UINT fuExitCode ); 结束自己    
     
    BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode);结束别的
    ================================
    某些紧急情况下,你可以使用TerminateThread()来终止一个线程。但是,除非没有别的办法了,否则不要用它。
    例如,当线程代码陷入死循环时。TerminateThread()的声明如下:
    function TerminateThread(hThread:THandle;dwExitCode:DWORD);TThread的Handle属性可以作为第一个参数,因此,TerminateThread()常这样调用:
    TerminateThread(MyHosedThread.Handle,0)
    如果选择使用这个函数,应该考虑到它的负面影响。
    首先,此函数在Windows NT与在Windows 95/98下并不相同。在Windows 95/98 下,这个函数能够自动清除线程所占用的栈;而在Windows NT下,在进程被终止前栈仍然保留。
    其次,无论线程代码中是否有try...finally块,
    这个函数都会使线程立即停止执行。这意味着,被线程打开的文件没有被关闭、由线程申请的
    内存没有被释放等情况。而且,这个函数在终止线程的时候也不通知D L L,当D L L关闭时,这也容易出现问题===============================
    一般情况下,利用将FreeOnTerminate的属性设为True的方法来及时清除线程对象是最方便的办法,这只需要在Excute()退出前设置就行了。
    设置方法如下:
    Procedure TTestThread.execute;
    Var
       i                : integer;
    Begin
       Inherited;
       FreeOnTerminate:=true;
       For i := 1 To 10000000 Do
          Begin
          if Terminated then break;
            inc(count);
            Synchronize(getcount);
          End;
    End;
      

  2.   

    我并不想也没有中止线程啊,只是将线程暂停,等发生某些事件的时候resume而已,为的是避免线程消耗系统资源。可结果发现,无法正确判断线程是否被挂起。