AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firedac SQL nichtblockierende ausführen
Thema durchsuchen
Ansicht
Themen-Optionen

Firedac SQL nichtblockierende ausführen

Ein Thema von QuickAndDirty · begonnen am 14. Nov 2018 · letzter Beitrag vom 19. Nov 2018
Antwort Antwort
QuickAndDirty

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

Firedac SQL nichtblockierende ausführen

  Alt 14. Nov 2018, 11:49
Datenbank: SQLite • Version: 3.0 • Zugriff über: Firedac
Ich meine vor langer Zeit mal eine eine Option in einer der Firedac Komponenten gefunden zu haben die einen SQL nicht blockierend also im "Hintergrund"/"Parallel" ausführt.
Kennt jemand diese Option?Edit: Hab Sie gefunden TQuery.ResourceOptions.CmdExecMode http://docwiki.embarcadero.com/RADSt...ution_(FireDAC)

Code:
amNonBlocking    The calling thread is blocked until an action is finished. The GUI is not blocked.
Wie geht das? Ist nicht der Hauptthread auch der UI Thread? Läuft intern eine Schleife die wartet und Processmessages aufruft?


Hätte noch Fragen zu Datenbank Threads...
Kann ich ein einziges Query Objekt in einem eigenen Thread erzeugen und arbeiten lassen oder muss ich auch eine Connection im Thread context erstellen?
Wenn ich pro Thread eine Connection haben muss kommt SQLite als Dateibasierte Datenbank überhaupt mit mehreren gleichzeitigen Verbindungen klar?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (14. Nov 2018 um 12:30 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Firedac SQL nichtblockierende ausführen

  Alt 14. Nov 2018, 13:32
Wenn ich pro Thread eine Connection haben muss kommt SQLite als Dateibasierte Datenbank überhaupt mit mehreren gleichzeitigen Verbindungen klar?
sqlite ist für SingleUser ausgelegt.
Technisch ist es sicher erstmal kein Problem.
Logisch schon eher, konkurrierende Aufgaben / Ressourcen führen dann eben zu Problemen, Wartezeiten, ..
Gruß, Jo
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: Firedac SQL nichtblockierende ausführen

  Alt 15. Nov 2018, 12: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 12:31 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: Firedac SQL nichtblockierende ausführen

  Alt 19. Nov 2018, 11:45
OK, also firedac kann auf SQLite unter windows Queries mit amNonBlocking ausführen.
unter Android werden diese wie amAsync ausgführt.
Eine Ausführung von SQLite queries mit dem CmdExecMode amAsync führt sowohl auf Android als auch auf Windows zu einer Shared cache Exception.
Man muss selber dafür sorgen das gleichzeitig immer nur ein query ausgeführt wird.
Das ginge per event OnAfterExecute und einer Warteschleife oder einer globalen SQLQueue...
Also auf jedenfall wäre ein Eingriff in den Code für jeden Aufruf notwendig.
Das Umstellen der Query properties reicht wenn man sich nur auf windows beschränkt, dass ist leider nicht machbar, für mich.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz