procedure TForm1.btn1Click(Sender: TObject);
       var
         a,b:Integer;
         label
          aa ;
     begin
       b:=0;
       a:=1;
        aa: b:=b+a   ;
              sleep(1000);
       edt1.text:=IntToStr(b);
                      goto aa ;
     end;编译不提示错误,一运行程序就没反应,把edt1.text:=IntToStr(b);改成showmessage让他在中间停一下可以。
初步估计是循环太占CPU了,所以停止响应了。我想一直循环这段应该怎么写。不用timer控件
~先谢了~~

解决方案 »

  1.   

    goto aa ;这句话总会直到aa: b:=b+a  ; 你没有设置跳出条件,永远也跳不出
      

  2.   

    没有循环跳出语句所以一致循环造成CPU使用率饱和。
      

  3.   

    如果想在中间看到Edit1.Text变化,加一句:procedure TForm1.btn1Click(Sender: TObject); 
    var 
      a,b:Integer; 
      label 
      aa ; 
    begin 
        b:=0; 
        a:=1; 
        aa: b:=b+a; 
        sleep(1000); 
        edt1.text:=IntToStr(b); 
        Application.Processmessage;
        if b=100 then exit;//如果b=100则调出循环 
        goto aa; //一般不建议使用goto语句 
    end; 
      

  4.   

    这段代码的用意是用来检查某个事件是否改变,要等到条件满足才跳出,因为有时候条件要用半个小时才能满足,等满足条件就会调用相应函数进行处理,等调
    用完函数又会回到循环检查状态。可以说这段代码是要一直循环的。如果这样会造成CPU使用率饱和,那应该怎么写?请前辈们指点一下。
    起初我也考虑过用timer控件,但是用担心用这样的问题————如果我设interval 1秒钟 但调用函数处理完事件要5秒钟,我担心后面事件还没处理完前面又在调用了。~~
      

  5.   


    有sleep(1000),cpu不会满。
      

  6.   

    声明一个全局变量(信号)
    var
      hnd: THANDLE;
    然后在创建线程时生成信号量
    hnd := CreateEvent(nil,True,False,nil);procedure TCheckThread.Execute;
    var
      i,j: Integer;
      aa: DWORD;
    begin
      inherited;
      while not terminated do
      begin
        aa := WaitForSingleObject(hnd,2000); //如果线程没结束,则每隔指定时间扫描一次
        if aa = WAIT_TIMEOUT then  //等待指定的时间2s后仍没有信号量,则进行下面处理
        begin
         //在这里进行处理
          //如果已不需要再运行,则需要设置信号量SetEvent(hnd),或者由程序其它部分设置,最后还要关闭信号量:CloseHandle(hnd); //关闭信号量   
          terminate;
         waitfor;
        end;
      end;
    end;
      

  7.   

    还是用计时器吧,触发事件后,挂起计时器,直到处理完毕再恢复重新计时。
    另外,有Sleep就不可能再CPU100%了吧?