delphi中延时函数的问题

一个作业要写个倒计时的程序,就想到了sleep,于是有了以下代码:procedureTForm1.btn1Click(Sender:TObject);vari:Integ... 一个作业要写个倒计时的程序,就想到了sleep,于是有了以下代码:
procedure TForm1.btn1Click(Sender: TObject);
var
i: Integer;
begin
for i:= 10000 downto 0 do
begin
Label1.Caption:= IntToStr(i);
Sleep(1000);
end;
end;
------------------------
本来的设想是让它每过一秒递减一次,但是程序真正运行时却会死掉,这是为什么呢?
另外还有个就是delay函数,这2个有什么区别吗?
展开
 我来答
百度网友09d4ae1
推荐于2016-11-30 · TA获得超过267个赞
知道小有建树答主
回答量:169
采纳率:0%
帮助的人:202万
展开全部
首先,程序死掉是表面的,应该程序主线程在循环里执行你的Sleep操作,不会响应你的其他窗口事件了。
要想不死,你可以使用多线程来sleep,这样主线程不至于在执行你的sleep而停止响应其他事件;

delay函数delphi里没有吧,一般是我们自己来写的,主要用到的是GetTickCount()来实现,这个函数相比sleep,他可以在死的状态下通过Application.ProcessMessages来告诉窗口这时要响应其他消息了,而不至让窗口一直在死,你移动窗口,或关闭窗口,点击按钮等操作都不会受影响

procedure Delay(MSecs: Longint);
//延时函数,MSecs单位为毫秒(千分之1秒)
var
FirstTickCount, Now: Longint;
begin
FirstTickCount := GetTickCount();
repeat
Application.ProcessMessages;
Now := GetTickCount();
until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount);
end;
更多追问追答
追问
对,我说的delay函数就是这个,现在有2个问题:
1,不明白我sleep(1000),也就是1秒后也该恢复正常了呀,起码数字也该减下啊,怎么就一直不动了呢?

2,这个Gettickcout()怎么快速声明,form里好像没有这个事件。
追答
label是一个标签控件,他的值实际已经变了,但你看到没变是因为窗口还没处理重画form页面的消息,因为之前跟你解释了,窗口一直在sleep.没时间处理其他消息,要等循环完了,窗口响应了重画的消息你就就看到最终i的值了。

你循环里加上application.ProcessMessages就能看到变了
for i:= 10000 downto 0 do
begin
label1.Caption:= IntToStr(i);
application.ProcessMessages;
Sleep(1000);
end;
Gettickcount是windows API函数,delphi的windows单元已经封装好了这个函数了,你uses windows后直接就能用的
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式