刚刚接触多线程,在窗体创建时建立线程,窗体关闭时释放线程。不管是手动释放还是自动释放,都会遇见程序无响应的状况。大家是否有遇见过?如果解决的?

解决方案 »

  1.   

    窗体关闭时释放线程
    释放线程的过程中,有一步是等待线程执行完毕,因此,如果你的线程一直在运行,那么自然就一直在等了,要么在线程的执行过程中加条件判断,或者
    如果这个Form是主窗口的话,在窗口关闭那里直接写上
    ExitProcess(0);让Windows去回收即可.
      

  2.   

    尝试在线程的执行过程中添加:
    begin 
     repeat
    //执行代码
    until isture ;//istrue判断条件
    end;
    在窗体关闭时,代码:
    begin
    istru:=true;
    线程.free;
    end;//仍然存在这样的问题
    另外,线程是在dll文件中建立的,使用ExitProcess(0);肯定不行的
      

  3.   

    以下情况,条件判断是没用的
    repeat
      Recv... ,阻塞在此,必须有数据了才继续往下,才会判断条件,也就是说这种情况,即使条件设置了也是没作用的,
    until isture ;//istrue判断条件
    这种情况很多,比如Sleep/WaitForSingObject一个比较长的时间等等,或者执行一次非常耗时的计算,都是如此,
    如果WaitForSingObject,可以改成WaitForMultipleObjects,加一个信号进去,一起等,然后判断信号源,
    如果是执行一次非常耗时的计算(如计算一个大的报表),那就判断条件下放,让执行过程始终会在一个较短的时间内执行判断条件.如果窗口关闭后就结束程序的话,如果没有特别需要处理的事情,可以ExitProcess(0),不在乎线程在哪里创建,也不在乎申请了多少内存,都统统让Windows处理
      

  4.   

    1.是用的TThread类来创建线程的,里面有一个terminate;
    2.用CreateThread,会返回一个Handle,然后再用一个while来判断var
      hwnd:Thandle;    //线程句柄
      ExitCode;Dword;  
    //退出码,STILL_ACTIVE代表线程依然在执行,如果线程中有返回值的话,线程执行结束就是获得其返回值。
    begin
      hwnd:=Createthread(.....);
      while true do
      begin
         GetExitCodeThread(hwnd,ExitCode);
         if ExitCode<>STILL_ACTIVE then  break; 
      end;
    end;
      

  5.   


    用TThread类来创建线程,在现在的execute中写了
    begin
    repeat
    ....
    until terminated
    end;在窗体关闭时,添加
    线程.terminate;这样仍出现程序无响应的状况。 
      

  6.   

    窗体关闭时,我写上了,线程.free
    还是无响应