某一线程一直在执行着,我要在程序里设定一个按钮事件,要让用户一按按钮就执行一系列语句,但必须结束该线程,并等待该线程完全结束后才能执行这些语句。请问这样实现?

解决方案 »

  1.   

    procedure test(p:pointer);stdcall
    begin
      while form1.bfalg=true do
      begin
        sleep(1);
        application.processmessage;
      end;
      form1.bfalg:=true ;
    end;
    procedure tform1.oncreate(sender;TObject);
    var
       h,threadid:Dword;
    begin
       bflag:=true;
       h:=createthread(nil,0,@test,nil,0,threadid);
    end;
    procedure tform1.button1onclick(sender:Tobject);
    begin
      set bflag:=false;
      while bflag=false do
      begin
        sleep(1);
        application.processmessage;
      end;
      .....
    end;
      

  2.   

    可以用Thread.waitfor一直等到该线程结束;但是如果该线程一直结束不了,就会造成好像程序死掉的现象;可以直接用EndThread(thread.handle)的办法强制结束,但是一般大家好像不推荐这样
      

  3.   

    把要执行的语句放到一个线程中然后在按钮实践中唤醒线程然后在其中waitfor就不会失去响应了
      

  4.   

    马上会给各位加分,先谢了。
    现在又有一个让我头疼的问题:一旦在刚开始创建线程对象时加上FreeOnTerminated;
    就不能用WaitFor语句结束线程,否则运行时就出现指针找不到对象的错误。
    请问各位这个问题怎样解决?
      

  5.   

    建议楼主即然创建这个线程了就不要释放它. 
    我说一个比较简单的办法,你可以试一下:
    1.仍然设置该线程的FREEONTERMINATE := TRUE;
    2.该线程中设置一个变量为True,例如:
    Procedure Exec ;
    begin
       doSomthing...;
       hasRun := True ; // 在IMPLEMENATION 中声明这个变量
       susPend;
    end;
    主线程通过检测hasRun来决定是否进行下一步代码的执行.
      

  6.   

    longtusoft(神灯之主) 的方法可以,你的问题其实就是线程间同步的问题,可以用变量,信号量,消息等方法地线程间的同步!
      

  7.   


        学习中...那位大哥有多线程的资料请给小弟一份 不胜感激啊
       mail:[email protected]