有两个函数 funA,funB 和一个全部变量gfunA 是线程里的方法,该方法对变量g有做修改funB 是主程序里的方法,该方法在进入的时间创建了线程A现在我想做的效果是,怎么让全局变量 g等于某一值时或执行时间大于10秒时funB函数才执行完毕并返回另一个值
我目前想到的办法比较笨拙在函数funB里 设置一个死循环
while ( true )
begin
  sleep(100);
  if g = 100 then
    break;
  application.ProcessMessages;
end;
result := true;这样做造成的效果是界面卡住了,虽然能做一些简单的操作,但是界面不能关闭退出

解决方案 »

  1.   

    上面“funB 是主程序里的方法,该方法在进入的时间创建了线程A ”写错了
    是 funB 是主程序里的方法,该方法在进入的时候创建了线程A 
      

  2.   

    把对g的判断放到线程中去,你不是在线程中要对变量进行修改吗,那么每次修改完就对该变量g进行一下判断,如果=100,那么发消息给主程序,PostMessage(Form1.Handle,WM_100,0,0);
    主程序中做一个消息响应函数,收到该消息后就做相应的动作
      

  3.   

    var
      I: Integer;
    result := false;
    I := 10 * 1000 div 100;
    while ( true )
    begin
      sleep(100);
      if g = 100 then
        break;
      application.ProcessMessages;
      Dec(I);
      if I<= 0 then begin
        Exit;
      end;
    end;
    result := true;
      

  4.   

    僵哥给我的实例上加了时间控制,其实我想要的不是这个,因为是死循环会造成界面卡住了,并且在没有执行完不能点关闭退出
    上面的几位都说用信号量,还有小和说发消息就可以了,我都不知道这个怎么做,能否给我一个简单的例子,在我下面的代码里更改也可以var  sum:Integer;type
      TTLSThread = class(TThread)
      private
      protected
        procedure Execute; override;
      public
        constructor Create();
      end;procedure SetShowStr();
    var
      i,j:integer;
    begin
      for i := 0 to 999999 do
      begin
        for j := 0 to 9999 do
           sum := j;
      end;
    end;constructor TTLSThread.Create();
    begin
      inherited Create(False);
    end;procedure TTLSThread.Execute;
    begin
      FreeOnTerminate := True;
      SetShowStr();
    end;procedure TMainForm.Button1Click(Sender: TObject);
    begin
      TTLSThread.Create();
      while ( true ) do  //等待sum的值被改变
      begin
        Sleep(100);
        Application.ProcessMessages;
        if sum >=9999 then
          break;
      end;
      ShowMessage(IntToStr(sum));
    end;
      

  5.   

    if sum >=9999 then
          break;
    这里不是已经可以跳出循环了吗
      

  6.   

    while ( true ) do  改为while ( Not Application.Terminated) do  
      

  7.   


    可能是还没明白我的意思,我是想最好的效果是在循环的时候能随时退出来,而不是非得等到一定时间或者 sum >=9999 的时候才退出来//比如说我有一个函数funB
    function funB;Boolean
    begin
      result := false;
      TTLSThread.Create(); //创建一个线程(该线程是在做一个数据收发的事情,变量g存放的是一个数据包的大小)  。。  if g >100 then   //如果数据包大于100个就退出
        result := true;
    end;//现在别人调用我的函数就可以直接这样做  if funB then
       showMessage('收到的包数已经达到100个');//而在 if funB then 这行代码执行的时候,他要能随时都可以退出来?
      

  8.   


    僵哥的这个方法已经达到了我想要的效果,Delphi里的发消息和上面几位说的使用信号量我搞Delphi一年多了却还是不懂,等手上的项目完了一定要好好学一下,不懂的再来发贴问你们吧,下午下班前结贴,看看有没有其他的答案。
      

  9.   


    忽略了一个问题,僵哥给的办法只是在主窗体里才有效果,因为Application 是相对于整个程序来说的,现在我只是一个子模块上使用方法funB还是退不出来
      

  10.   

    FormClose当中设置某一个状态变量比如CloseFlag然后就用while Not( Application.Terminated and CloseFlag) do  
      

  11.   


    因为这个函数funB是要给别人调用,能不能不设置 CloseFlag ?有没有其他更好的办法?