我写了一个线程,在主窗体中单击一个button来创建这个线程。
这个线程不会去访问VCL,只做数值计算用。
在线程的Execute中
如果使用Synchronize(),它会使用主VCL线程,这样一来,在这个线程执行中,我的主窗口死锁,什么事情都做不了。
于是我没有使用Synchronize(),这样以来在线程执行的时候,我的主窗口可以活动。
但是,当我要退出主窗口的时候。我用
Athread.Terminate;
close;
总是报错。不能够正常终止程序!这个问题改如何解决?

解决方案 »

  1.   

    在Execute函数开头加入FreeOnTerminate:=true;然后设置一个变量(FStop)来控制线程执行。当FStop为True时执行代码。当FStop为False时则不执行,Execute退出。在关闭窗口时只要设置FSTOP为FALSE就可以关闭线程与程序了
      

  2.   

    在线程的Execute中不能出现死循环。
    Athread.Terminate;只是把thread.terminated标为true
    Execute执行完后检查terminated如果为true则退出。
    改为如下:
    while not terminated do
    begin
      ......//place your code here
    end;
      

  3.   

    我也用了
    while not terminated do
    begin
      ......//place your code here
    end;但是我的一次处理就需要很长时间(几分钟),我想让它立即终止,恐怕这样写,会达不到效果吧
      

  4.   

    把一次处理分解成多个处理,
    或者用强制推出terminatethread(thread.handle,0),不过不推荐
      

  5.   

    把一次处理分解成多个处理,
    或者用强制退出terminatethread(thread.handle,0),不过不推荐容易造成资源泄漏。
      

  6.   

    在你的处理里面判断 terminated
      

  7.   

    好比说我读一个文件,执行一个SQL查询要几分钟,我只可能在这个查询完成只好插入terminated
    ,但是,我要是退出时,这个SQL查询还在执行,如何是好?
    另外terminatethread(thread.handle,0)我也知道,但是不安全,肯定是不能用的,那么如何是好?
      

  8.   

    主程序退出前 把线程 free 掉