Application.ProcessMessages 放在sleep 前还是后?

okgxs 2011-05-20 11:47:21
sleep(100);
Application.ProcessMessages;

dowork

还是

Application.ProcessMessages;

sleep(100);

dowork

...全文
616 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Elvis_chen 2012-04-12
  • 打赏
  • 举报
回复
application.ProcessMessages;后面为什么还要用Sleep呢?
tsk 2011-07-31
  • 打赏
  • 举报
回复
比较精彩的争论啊。。。。。
yqdragon 2011-06-01
  • 打赏
  • 举报
回复
放在前后都要等待
我做通讯也都用自定义的这个
procedure TimeDelay(dt:dword);
var
tt:dword;
begin
tt := GetTickCount();
while GetTickCount()-tt<dt do
application.ProcessMessages;//释放控制权
end;
iamduo 2011-05-31
  • 打赏
  • 举报
回复
(有界面的)主线程,也是一个线程。
当你调用 Sleep 的时候,就意味着让这个线程“挂起”。
把执行权给其他线程(如果有的话)。
1000毫秒(会有一些大于,这个是调度造成的延时)后拿回执行权。
主线程被挂起的话,那么连主线程中的“消息”也不会执行,
这些消息包括WM_Paint之类画界面的,相应鼠标键盘的,这些内容。
所以,主线程就有假死现象。
直到 1000 毫秒后,主线程才拿回执行权。
所以,主线程不该使用 Sleep
贝隆 2011-05-31
  • 打赏
  • 举报
回复
放到后面,sleep时间短些,长了会造成假死
skylkj 2011-05-31
  • 打赏
  • 举报
回复
放哪sleep都会假死,前后完全没区别

不想假死就用循环的方法,本来要sleep(1000)的,改成


for i:1 to 10 do
begin
Application.ProcessMessages;
sleep(100);
end;


油蛋 2011-05-31
  • 打赏
  • 举报
回复
前后都一样啊
okgxs 2011-05-25
  • 打赏
  • 举报
回复
大家说的都很强,还是有点晕!
jakefj 2011-05-23
  • 打赏
  • 举报
回复
多线程是不用sleep,因为主线程占用的话线程处于二级线程会让给主线程先处理,用sleep的话它会默认是主线程的动作,会造成停止操作时间。你可以看一下delphi自带的线程优先级的帮助.
AFSDAD 2011-05-21
  • 打赏
  • 举报
回复
为什么不用sleep(0);
shijies 2011-05-21
  • 打赏
  • 举报
回复
Delphi中三种延时方法及其定时精度分析(转载)

 在Delphi中,通常可以用以下三种方法来实现程序的延时,即TTtimer控件,Sleep函数,GetTickCount函数。但是其精度是各不相同的。
一、三种方法的简单介绍

1)TTtimer控件

  TTtimer控件的实质是调用Windows API定时函数SetTimer和KillTimer来实现的,并简化了对WM_TIMER 消息的处理过程。通过设置OnTimer事件和Interval属性,我们可以很方便的产生一些简单的定时事件。

2)Sleep函数

  Sleep函数用来使程序的执行延时给定的时间值。Sleep的调用形式为Sleep(milliseconds),暂停当前的进程milliseconds毫秒。Sleep的实现方法其实也是调用Windows API的Sleep函数。例如:

sleep(1000); //延迟1000毫秒

Sleep会引起程序停滞,如果你延迟的时间较长的话,你的程序将不能够响应延时期间的发生的其他消息,所以程序看起来好像暂时死机。

3)GetTickCount函数

  在主程序中延时,为了达到延时和响应消息这两个目的,GetTickCount()构成的循环就是一种广为流传的方法。例如:

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;


可见,相对而言,Sleep的精度最高,尤其是在10ms以内的延时,只有sleep函数才能够做到。TTimer控件的定时精度最差,而且稳定性不好,波动很大。GetTickCount函数所能实现的最短延时为15ms左右,稳定性相对TTimer要好一些。
http://www.delphibbs.com/keylife/iblog_show.asp?xid=29191


until ((GetTickCount - FirstTickCount) >= Longint(msecs));




一般用在比较费时的循环中, 它会检查并先处理消息队列中的其他消息.

但这算不上多线程, 譬如: 运行中你拖动窗体, 循环会暂停下来..
Application.ProcessMessages;
haitao 2011-05-21
  • 打赏
  • 举报
回复
多线程,直接sleep(几千毫秒都不怕),卡死的只是一个线程,主线程没影响
要的也就是这个效果

单线程,主线程sleep(几百毫秒)就会导致程序期间明显的无反应
所以使用
sleep(100); //没有它,循环很频密,cpu会很高
Application.ProcessMessages;//没有它,主线程没机会响应用户界面操作
的交替循环实现长时间的sleep

如果是后面有较费时的dowork
则sleep(100)可以不用了,因为dowork导致循环不会很频密了
Believe 2011-05-21
  • 打赏
  • 举报
回复
学习中。。。
Mit1208 2011-05-20
  • 打赏
  • 举报
回复
放在前,后都会使用CPU暂停一段时间.
界面都会假死的
xinghun61 2011-05-20
  • 打赏
  • 举报
回复
感觉之后好点,因为在sleep期间,当前窗体应该还在接受各种消息(仅仅是个人猜测,没验证),在sleep结束之后先调用ProcessMessages将未处理的消息处理完,然后,dowork
hongss 2011-05-20
  • 打赏
  • 举报
回复
有了 Application.ProcessMessages 加上GetTickCount就可以实现毫秒级延时。

Sleep总会造成系统假死的
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ccrun 的回复:]
有了 Application.ProcessMessages 就无需Sleep了。
[/Quote]
ccrun.com 2011-05-20
  • 打赏
  • 举报
回复
有了 Application.ProcessMessages 就无需Sleep了。
Mit1208 2011-05-20
  • 打赏
  • 举报
回复
多线程没必要调用Application.ProcessMessages;
okgxs 2011-05-20
  • 打赏
  • 举报
回复
另外:
多线程中:调用 Application.ProcessMessages 会有问题吗;用什么来替代?
加载更多回复(2)

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧