Also amBlocking führt das ganze
Query in einem Task/Thread aus und ruft danach in einer Warteschleife WaitForMultipleObjects für eine millisekunde auf. In dieser Warte schleife untersucht mit peekmessage die Messagequeue und führt nur bestimmte Messages mit Dispatchmessage aus.
Das wiederholt sich läuft so lange bis der Task endet.
Welche Messages sind für die Funktionlität dieser procedure aus FMX.Forms notwendig?
Delphi-Quellcode:
procedure ReleaseForm(const AForm: TCommonCustomForm); // TO-DO: Move following code to separated method
begin
with AForm do
if not (TFmxFormState.Released in FFormState) then
begin
FWinService.ReleaseWindow(AForm);
Screen.RemoveForm(AForm);
FFormState := FFormState + [TFmxFormState.Released];
if TFmxFormState.Engaged in FormState then
begin
if not (csDesigning in ComponentState) then
FWinService.HideWindow(AForm);
end;
{$IFDEF ANDROID} // RSP-17938
TThread.CreateAnonymousThread(
procedure
begin
TThread.CurrentThread.Queue(nil,
procedure
begin
DisposeOf;
end);
end).Start;
{$ELSE}
TThread.CurrentThread.ForceQueue(nil,
procedure
begin
DisposeOf;
end);
{$ENDIF}
TMessageManager.DefaultManager.SendMessage(AForm, TFormReleasedMessage.Create);
end;
end;
Delphi-Quellcode:
TThread.CurrentThread.Queue
TThread.CurrentThread.ForceQueue
Augenscheinlich arbeiten diese beiden Methoden mit der MessageQueue, denn
Delphi-Quellcode:
//ungetesteter pseudo code aber in echtem projektbezogenem code so nachvollzogen
{$IFDEF ANDROID} // RSP-17938
TThread.CreateAnonymousThread(
procedure
begin
TThread.CurrentThread.Queue(nil,
procedure
begin
DoSomething;
end);
end).Start;
{$ELSE}
TThread.CurrentThread.ForceQueue(nil,
procedure
begin
DoSomething;
end);
{$ENDIF}
Application.processmessages;
For i:= 1 to infinity do;
führt zur sofortigen Ausführung von "DoSomething"
Und es ist für mich wichtig, dass diese Messages NICHT von der Warteschleife des Querys Dispatched werden.
Hm...
ich baue mir ne test app