void idle(  DWORD dwTimeout,
            DWORD dwTimeInterval = 1)
{
    MSG msg;
    DWORD dwTimeNext = GetTickCount() + dwTimeout;
    // Wait time next.
    while (GetTickCount() < dwTimeNext)
    {
        Sleep(dwTimeInterval);
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
}
在Delphi下面有对应的吗?
Sleep()API是不行的,会堵塞其它的消息处理.有什么解决方案吗?

解决方案 »

  1.   

    我的意思是
    OnButtonClick()
    {
    Sleep(100000);}
    但是整个窗口别的消息还可以处理,明显,Sleep是堵塞的.
    触发该函数后,100秒后返回,在这100秒期间,别的窗口消息不会堵塞
      

  2.   

    procedure idle(Timeout :DWord);
    var
      TimeNext : DWord;
    begin
      TimeNext := GetTickCount() + TimeOut;
      while(GetTickCount() < TimeNext)do
      begin
        Application.ProcessMessages ;
      end;
    end;
    这样不是很好!造成太高的CPU占有量。应该还有更好的方法。
      

  3.   

    sleep(1)并不是一个好主意, 效率太低. 特别是对cpu主频越来越高的今天来说.随手写了一段代码你试试看(我这没delphi), 开了一个线程进行等待:type
      TIdleStruct = record
        ThrdId: THandle;
        WaitTick: Cardinal;
        Waiting: Boolean;
      end;
      PIdleStruct = ^TIdleStruct;procedure Idle(Tick: Cardinal);
    var
      Info: TIdleStruct;
      Unused: Integer;
      Msg: TMessage;  function IdleFunc(Info: PIdleStruct): Integer; stdcall;
      begin
        sleep(Info.WaitTick);
        Info.Waiting := false;
        PostThreadMessage(Info.ThrdId, WM_USER, 0, 0);
        result := 0;
      end;begin
      Info.ThrdId := GetCurrentThreadId;
      Info.WaitTick := Tick;
      Info.Waiting := True;
      CreateThread(nil, 0, @IdleFunc, @Info, 0, Unused);
      while Info.Waiting and GetMessage(Msg, 0, 0, 0) do
      try
        TranslateMessage(msg);
        DispatchMessage(msg);
      except
      end;
    end;
      

  4.   

    .....定义有误:
    var
      Msg: TMessage应当改成  Msg: TMsg;
      

  5.   

    delphi 有个控件  ApplicationEvents1
    其中的事件:
    procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
    beginend;应该就是你要的
      

  6.   

    aiirii(ari-淘金坑) 这个方法存在调用不及时,没有没有象MFC框架提供的OnIdle那样的空闲调用计数。不好控制,也容易造成CPU占用率高。
      

  7.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        procedure MyIdle(Sender: TObject; var Done: Boolean);
      public
        count:integer;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnIdle:=MyIdle;
    end;procedure TForm1.MyIdle(Sender: TObject; var Done: Boolean);
    begin
      Inc(count);
      Caption:=IntToStr(count);
    end;end.
      

  8.   

    其实关键就是这三句 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    不用delphi给你提供的Application.OnIdle事件自己写只要上面那三句在,怎么写都是可以的