Application.ProcessMessages 放在sleep 前还是后? sleep(100);Application.ProcessMessages;dowork还是Application.ProcessMessages;sleep(100);dowork 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 感觉之后好点,因为在sleep期间,当前窗体应该还在接受各种消息(仅仅是个人猜测,没验证),在sleep结束之后先调用ProcessMessages将未处理的消息处理完,然后,dowork 放在前,后都会使用CPU暂停一段时间.界面都会假死的 三楼的大师,比较同意你的观点Application.ProcessMessages这个东西到底用的尺度 怎么控制,比如多个地方,如果加这个多了,会不会引起本身进程的死机? 另外:多线程中:调用 Application.ProcessMessages 会有问题吗;用什么来替代? 多线程没必要调用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秒)varFirstTickCount, Now: Longint;beginFirstTickCount := GetTickCount();repeatApplication.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; 多线程是不用sleep,因为主线程占用的话线程处于二级线程会让给主线程先处理,用sleep的话它会默认是主线程的动作,会造成停止操作时间。你可以看一下delphi自带的线程优先级的帮助. 放哪sleep都会假死,前后完全没区别不想假死就用循环的方法,本来要sleep(1000)的,改成for i:1 to 10 do begin Application.ProcessMessages; sleep(100); end; 放到后面,sleep时间短些,长了会造成假死 (有界面的)主线程,也是一个线程。当你调用 Sleep 的时候,就意味着让这个线程“挂起”。把执行权给其他线程(如果有的话)。1000毫秒(会有一些大于,这个是调度造成的延时)后拿回执行权。主线程被挂起的话,那么连主线程中的“消息”也不会执行,这些消息包括WM_Paint之类画界面的,相应鼠标键盘的,这些内容。所以,主线程就有假死现象。直到 1000 毫秒后,主线程才拿回执行权。所以,主线程不该使用 Sleep 放在前后都要等待我做通讯也都用自定义的这个procedure TimeDelay(dt:dword);var tt:dword;begin tt := GetTickCount(); while GetTickCount()-tt<dt do application.ProcessMessages;//释放控制权end; application.ProcessMessages;后面为什么还要用Sleep呢? 在哪里可以下载delphi 7 sp1? delphi 6 xml mapper 怎么把数据截断了啊? 我想问一下软件做好了怎么做连接数据库文件? NND的...今天炒了老板的鱿鱼..散分 如何使delphi程序在一个时间自动运行呢 怎样把dbgrid中的数据一次性全部导入到excel表格中?? 一个对象占用了多少字节的内存?用什么命令? 请问哪里有中文的REPORTBUILD? delphi的主界这样的表单(就算是按最大化按钮也不会遮住屏幕)是如何实现的? 巨分求救,我一定给分,问题对于稍微懂的人应该不在话下 cxgrid分组后,如何修改每一组‘+’后面的标题? 求高效的大文件操作方法
界面都会假死的
多线程中:调用 Application.ProcessMessages 会有问题吗;用什么来替代?
要的也就是这个效果单线程,主线程sleep(几百毫秒)就会导致程序期间明显的无反应
所以使用
sleep(100); //没有它,循环很频密,cpu会很高
Application.ProcessMessages;//没有它,主线程没机会响应用户界面操作
的交替循环实现长时间的sleep如果是后面有较费时的dowork
则sleep(100)可以不用了,因为dowork导致循环不会很频密了
一、三种方法的简单介绍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;
for i:1 to 10 do
begin
Application.ProcessMessages;
sleep(100);
end;
当你调用 Sleep 的时候,就意味着让这个线程“挂起”。
把执行权给其他线程(如果有的话)。
1000毫秒(会有一些大于,这个是调度造成的延时)后拿回执行权。
主线程被挂起的话,那么连主线程中的“消息”也不会执行,
这些消息包括WM_Paint之类画界面的,相应鼠标键盘的,这些内容。
所以,主线程就有假死现象。
直到 1000 毫秒后,主线程才拿回执行权。
所以,主线程不该使用 Sleep
我做通讯也都用自定义的这个
procedure TimeDelay(dt:dword);
var
tt:dword;
begin
tt := GetTickCount();
while GetTickCount()-tt<dt do
application.ProcessMessages;//释放控制权
end;