可以参考DELPHI VCL 中用来实现消息循环的代码<br>这是APPLICATION的RUN函数,Application 创建并初始化后就会进入这个过程<br>procedure TApplication.Run;<br>begin<br> FRunning := True;<br> try<br> ...<br> repeat<br> try<br> HandleMessage; //重复循环调用消息处理函数 HandleMessage<br> except<br> HandleException(Self);<br> end;<br> until Terminated;<br> end;<br> finally<br> FRunning := False;<br> end;<br>end;<br>这是HandleMessage方法,通过调用消息处理函数ProcessMessage,处理消息队列中的消息,如果没有消息处理就调用空闲函数Idle<br>procedure TApplication.HandleMessage;<br>var<br> Msg: TMsg;<br>begin<br> if not ProcessMessage(Msg) then Idle(Msg);<br>end;<br><br>这是ProcessMessage方法,通过调用PeekMessage API从WINDOWS消息队列中取出自己的消息交给DELPHI中的消息处理过程处理,再通过 TranslateMessage 和 DispatchMessage将未处理的消息分发给对应的窗口消息过程或者线程消息过程,楼主需要实现的函数和这个类似<br>function TApplication.ProcessMessage(var Msg: TMsg): Boolean;<br>var<br> Handled: Boolean;<br>begin<br> Result := False;<br> if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then<br> begin<br> Result := True;<br> if Msg.Message <> WM_QUIT then<br> begin<br> Handled := False;<br> if Assigned(FOnMessage) then FOnMessage(Msg, Handled);<br> if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and<br> not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then<br> begin<br> TranslateMessage(Msg);<br> DispatchMessage(Msg);<br> end;<br> end<br> else<br> FTerminate := True;<br> end;<br>end;<br><br>这是ProcessMessage,作用就是不断调用ProcessMessage将消息队列中的消息全部取出并处理完成。它的一个重要用途就是当RUN过程中在REPEAT循环过程里出现耗时操作时,可以通过直接调用ProcessMessages处理进程中的消息,不至于因为消息未得到即使处理而出现界面卡死的情况。看起来有点像多线程的效果,呵呵~~<br>procedure TApplication.ProcessMessages;<br>var<br> Msg: TMsg;<br>begin<br> while ProcessMessage(Msg) do {loop};<br>end;<br><br>至于ProcessMessages为什么会导致CPU 100%,当队列中没有消息了的时候,ProcessMessage根本不会进入消息处理过程,而是直接跳出,调用中间又没有SLEEP,当然会100%了,呵呵~~