![]() |
Datenbank: SQLite • Version: 3.0 • Zugriff über: Firedac
Firedac SQL nichtblockierende ausführen
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 ![]()
Code:
Wie geht das? Ist nicht der Hauptthread auch der UI Thread? Läuft intern eine Schleife die wartet und Processmessages aufruft?
amNonBlocking The calling thread is blocked until an action is finished. The GUI is not blocked.
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? |
AW: Firedac SQL nichtblockierende ausführen
Zitat:
Technisch ist es sicher erstmal kein Problem. Logisch schon eher, konkurrierende Aufgaben / Ressourcen führen dann eben zu Problemen, Wartezeiten, .. |
AW: Firedac SQL nichtblockierende ausführen
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:
Augenscheinlich arbeiten diese beiden Methoden mit der MessageQueue, denn
TThread.CurrentThread.Queue
TThread.CurrentThread.ForceQueue
Delphi-Quellcode:
führt zur sofortigen Ausführung von "DoSomething"
//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; 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 |
AW: Firedac SQL nichtblockierende ausführen
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz