我在程序里面 启动一个线程, 这个线程是对一个表由头到尾地处理数据。 但是我想停止这个线程,好像停止不了的?反而暂停和继续就行。请问是什么问题? 谢谢!

解决方案 »

  1.   

    线程的Execute方法中加 Terminated 判断,Terminated = True 就跳出
      

  2.   

    Terminate只是把线程的Terminated属性设置为True而已,如果你的Execute里的某个方法正在执行的话,线程是不会停止的(直到你的方法执行完,线程判断到Terminated属性位置)。作为要随时停止的线程,一个好的习惯是把大的操作分小,这样才可以方便随时判断到Terminated属性是否为true。如果操作实在不可细分,还有一种歪门点的办法就是,利用异常来停止当前执行的方法,然后捕捉异常后退出线程。最终方法是用API的TerminateThread,不过一般不建议使用,所有后果自己负责(如资源释放等)
      

  3.   

    楼上兄弟,我已经按照你的方法但是,MyThread.Terminate 后, 线程还保存在内存里面的?
    我需要把他 MyThread.free 和 MyThread.destroy 吗?我执行了以上操作了,但是关闭窗体报错。
    不知道是否由于线程没有处理好。还有,我用了线程,执行完线程的操作后 会报: Error creating window device context ,这个错不是每次都报,请问由是什么原因?
      

  4.   

    在我的项目里面我是把整个线程类给释放掉了就没有那问题,好像是 .Free 还是 :=nil 记不太清楚了
      

  5.   

    但是,MyThread.Terminate   后,   线程还保存在内存里面的? 
    我需要把他   MyThread.free   和   MyThread.destroy   吗?
    ----------------------------------------------------------
    对,线程还没释放,你需要在外面把它释放掉;或者把其FreeOnTerminate属性设置成true也可以。
      

  6.   

    楼上的兄弟?
    不都是楼主(kciv )一个人吗? 
      

  7.   

    晕 ,csdn怎么搞的,开始显示的全是楼主的帖!! :(
      

  8.   

    但是,MyThread.Terminate   后,   线程还保存在内存里面的?  
    我需要把他   MyThread.free   和   MyThread.destroy   吗? 
    ---------------------------------------------------------- 
    对,线程还没释放,你需要在外面把它释放掉;或者其FreeOnTerminate属性设置成true也可以。
    问题是,有些情况是不能等到线程完成我就想把它关闭啊,如果其FreeOnTerminate属性设置成true,是要等到线程结束才释放的吧?
      

  9.   

    对了 ,如果没有等线程完成,就关闭窗体,报这个错:Project Project2.exe raised exception class EStackOverflow with message 'Stack overflow'.Process stopped.Use Step or Run to continue .
      

  10.   

    问题是,有些情况是不能等到线程完成我就想把它关闭啊,如果其FreeOnTerminate属性设置成true,是要等到线程结束才释放的吧?
    ------------------------------------------
    你把它terminate了,不就结束了?然后FreeOnTerminate就有用了。当然你想随时停的话,Execute里的循环必须要能做到随时检查Terminated标记才行,或者使用其它方法以让程序能检测到此标记。
      

  11.   

    如果没有等线程完成,就关闭窗体,报这个错
    ----------------
    所以我现在比较习惯在窗体上进行线程释放,Free之前先来个WaitFor,保证窗体等待线程释放完后再释放。不过overflow错误估计是由你的线程内部引起的(我不知道具体实现),一般出现循环调用,导致内存急剧增加,就有可能stack overflow
      

  12.   

    上面的问题还没有解决。
    又有一个新问题了。调用线程,运行了一下,报错:Project Projec2.exe raised exception class EAccessViolation with message 'Access violation at address 004E0F64 in module'Project2.exe'.Read of address 00000028'. Process stopped.Use Step or Run to continue.在我的笔记本没有这个问题,我的笔记本是单核cpu 。在台式机是双核的,不知道跟这个有关系吗?我试了双cpu的也报这样的错。
      

  13.   

    前几天,我用Socket编写多文件传输的时候,处理过类似的问题,
    我在ClientExecute{相当于TThread的Execute}里面终止线程
    参考代码:
        while (not Terminated) and ClientSocket.Connected do
        begin
          ......
          if ReadText = Key_clt[4] then
            Terminate;
        end;