[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]
Routine that allows Windows programs to continue to process while in a
processing loop.
There are two basic ways of handling loop processing in Windows
that would otherwise take away control (tie up processing of your
code and not allow other processes to run) of other running
Window's applications. The first and probably the most flexible
approach is to write a processing loop and 'YIELD' to other
Windows application's request. The second approach would be to
override TApplication's MessageLoop method and within the
MessageLoop call your process.
'YIELD'
If your procedure that takes a while to execute contains some
sort of outer loop, make a call to a procedure that allows other
apps to run. Your time consuming code might look something like:
...
While MoreToDo do
begin
YieldToOthers;
DoSomeProcessing;
end;
A few notes concerning this procedure:
* The call to HALT may need to be modified to do any cleanup
required
(i.e.: close open files, etc.).
* You'll need to be sensitive to re-entrant issues.
The procedure "YieldToOthers" would look like:
Procedure YieldToOthers;
var
Msg : TMsg;
begin
While PeekMessage(Msg,0,0,0,PM_REMOVE) do begin
if Msg.Message = WM_QUIT then begin
Application^.Done;
halt; {!!}
end;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
'MessageLoop'
This is a replacement for the TApplication MessageLoop method.
It provides for an 'idle loop' where your program can
continuously process its own work, and yet still yield control to
windows when windows needs to do something.
TMyApp = object(TApplication)
procedure MessageLoop; virtual; { add this method to your }
end; {* descendant of TApplication *}
{* just paste this in to your program *}
procedure TMyApp.MessageLoop;
var
Message: TMsg;
begin
while true do begin
if PeekMessage(Message, 0, 0, 0, pm_Remove) then begin
if Message.Message = wm_Quit then Exit;
TranslateMessage(Message);
DispatchMessage(Message);
end
else begin
{** do your stuff here **}
end;
end;
Status := Message.WParam;
end;
[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]