sleep(100);
Application.ProcessMessages;dowork还是Application.ProcessMessages;sleep(100);dowork

解决方案 »

  1.   

    感觉之后好点,因为在sleep期间,当前窗体应该还在接受各种消息(仅仅是个人猜测,没验证),在sleep结束之后先调用ProcessMessages将未处理的消息处理完,然后,dowork
      

  2.   

    放在前,后都会使用CPU暂停一段时间.
    界面都会假死的
      

  3.   

    三楼的大师,比较同意你的观点Application.ProcessMessages这个东西到底用的尺度 怎么控制,比如多个地方,如果加这个多了,会不会引起本身进程的死机?
      

  4.   

    另外:
    多线程中:调用 Application.ProcessMessages 会有问题吗;用什么来替代?
      

  5.   

    多线程没必要调用Application.ProcessMessages;
      

  6.   

    有了 Application.ProcessMessages 就无需Sleep了。
      

  7.   

    有了 Application.ProcessMessages 加上GetTickCount就可以实现毫秒级延时。Sleep总会造成系统假死的
      

  8.   

    多线程,直接sleep(几千毫秒都不怕),卡死的只是一个线程,主线程没影响
    要的也就是这个效果单线程,主线程sleep(几百毫秒)就会导致程序期间明显的无反应
    所以使用
    sleep(100); //没有它,循环很频密,cpu会很高
    Application.ProcessMessages;//没有它,主线程没机会响应用户界面操作
    的交替循环实现长时间的sleep如果是后面有较费时的dowork
    则sleep(100)可以不用了,因为dowork导致循环不会很频密了
      

  9.   

    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;
      

  10.   

    多线程是不用sleep,因为主线程占用的话线程处于二级线程会让给主线程先处理,用sleep的话它会默认是主线程的动作,会造成停止操作时间。你可以看一下delphi自带的线程优先级的帮助.
      

  11.   

    放哪sleep都会假死,前后完全没区别不想假死就用循环的方法,本来要sleep(1000)的,改成
    for i:1 to 10 do 
       begin
       Application.ProcessMessages;
       sleep(100);
       end;
      

  12.   

    放到后面,sleep时间短些,长了会造成假死
      

  13.   

    (有界面的)主线程,也是一个线程。
    当你调用 Sleep 的时候,就意味着让这个线程“挂起”。
    把执行权给其他线程(如果有的话)。
    1000毫秒(会有一些大于,这个是调度造成的延时)后拿回执行权。
    主线程被挂起的话,那么连主线程中的“消息”也不会执行,
    这些消息包括WM_Paint之类画界面的,相应鼠标键盘的,这些内容。
    所以,主线程就有假死现象。
    直到 1000 毫秒后,主线程才拿回执行权。
    所以,主线程不该使用 Sleep
      

  14.   

    放在前后都要等待
    我做通讯也都用自定义的这个
    procedure TimeDelay(dt:dword);
    var
      tt:dword;
    begin
      tt := GetTickCount();
      while GetTickCount()-tt<dt do
        application.ProcessMessages;//释放控制权
    end;
      

  15.   

    application.ProcessMessages;后面为什么还要用Sleep呢?