Application.ProcessMessages 放在sleep 前还是后?
sleep(100);
Application.ProcessMessages;
dowork
还是
Application.ProcessMessages;
sleep(100);
dowork
[解决办法]
感觉之后好点,因为在sleep期间,当前窗体应该还在接受各种消息(仅仅是个人猜测,没验证),在sleep结束之后先调用ProcessMessages将未处理的消息处理完,然后,dowork
[解决办法]
放在前,后都会使用CPU暂停一段时间.
界面都会假死的
[解决办法]
放前面,否则sleep还会假死
[解决办法]
多线程没必要调用Application.ProcessMessages;
[解决办法]
有了 Application.ProcessMessages 就无需Sleep了。
[解决办法]
[解决办法]
有了 Application.ProcessMessages 加上GetTickCount就可以实现毫秒级延时。
Sleep总会造成系统假死的
[解决办法]
学习中。。。
[解决办法]
多线程,直接sleep(几千毫秒都不怕),卡死的只是一个线程,主线程没影响
要的也就是这个效果
单线程,主线程sleep(几百毫秒)就会导致程序期间明显的无反应
所以使用
sleep(100); //没有它,循环很频密,cpu会很高
Application.ProcessMessages;//没有它,主线程没机会响应用户界面操作
的交替循环实现长时间的sleep
如果是后面有较费时的dowork
则sleep(100)可以不用了,因为dowork导致循环不会很频密了
[解决办法]
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;