Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#3

AW: Firedac SQL nichtblockierende ausführen

  Alt 15. Nov 2018, 11:05
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
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (15. Nov 2018 um 11:31 Uhr)
  Mit Zitat antworten Zitat