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控件
~先谢了~~
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控件
~先谢了~~
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;
用完函数又会回到循环检查状态。可以说这段代码是要一直循环的。如果这样会造成CPU使用率饱和,那应该怎么写?请前辈们指点一下。
起初我也考虑过用timer控件,但是用担心用这样的问题————如果我设interval 1秒钟 但调用函数处理完事件要5秒钟,我担心后面事件还没处理完前面又在调用了。~~
有sleep(1000),cpu不会满。
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;
另外,有Sleep就不可能再CPU100%了吧?