Lade...
 

WaitOnInput

WaitOnInput

WaitOnInput, WaitOnInput(intervall)

Parameter: Time-Out-Intervall in Sekunden

Stack
Stack Position Beschreibung
Stack(In) Top beliebig
Stack(Out) Top Werte von FinishInput

Der InstantView®-Interpreter führt die auf WaitOnInput folgenden Anweisungen zunächst nicht aus, sondern hält die Abarbeitung des Call-Stacks an. Der Interpreter arbeitet ab jetzt neu auftretende Events und bislang aufgelaufene PostMsg-Aufrufe ab, kann also bspw. auf Benutzerinteraktion reagieren. Die Anweisung FinishInput beendet den Wartezustand. Die auf WaitOnInput folgende Anweisung erhält dann die Steuerung. Auf dem Stack befinden sich die Werte, die FinishInput vorgefunden hat.

Die Werte, die vor WaitOnInput auf dem Stack waren, gehen verloren.

Mit dem Anweisungspaar WaitOnInput–FinishInput kann der ereignisorientierte Ablauf von InstantView® aufgebrochen werden. Das ist sinnvoll, wenn innerhalb des Programmflusses Antworten des Anwenders gebraucht werden.

Die interne Arbeitsweise von WaitOnInput ist hier nochmal näher beschrieben.

Falls vor WaitOnInput ein CloseWindow ausgeführt wurde, dann wird das finale Schließen des Fensters für den Zeitraum des WaitOnInput verzögert.

Timeout

WaitOnInput ohne Parameterangabe wartet beliebig lange. Durch Angabe eines Zeitintervalls n kann die Wartezeit begrenzt werden: Wenn nach n Sekunden weder ein Tastatur- noch ein Mausevent registriert wurde, wird die auf auf WaitOnInput folgende Anweisung ausgeführt.

Geändertes Verhalten
Ab Dll-Version 225253 Vor Dll-Version 225253
WaitOnInput beendet die laufende Transaktion nicht. Diese wird implizit beendet, wenn die Runtime (innerhalb von WaitOnInput) idle ist. 
Falls keine PostMsg in der RequestQueue steht, dann wird die Transaktion praktisch sofort beendet, da die Runtime durch WaitOnInput Idle ist.
Da PostMsg-Anfragen innerhalb von WaitOnInput sofort abgearbeitet werden, werden diese in der gleichen Transaktion bearbeitet.
WaitOnInput (ohne KEEP) beendet direkt die aktuelle Transaktion (Commit),
um die Datenbank durch WaitOnInput nicht zu blockieren.
Neu angefangene Transaktionen innerhalb von WaitOnInput können nur durch ein explizites EndTXN beendet werden. Die Transaktion wird nicht implizit beendet, sobald die Runtime idle ist.


InstantView®-Code kann von Messages getriggert werden, die von einer Methode eines persistenten Objekts (einer C++-Funktion) gesendet wurden, d.h. am Ende der Anweisungsfolge wird wieder C++-Code der Funktion ausgeführt.  
In diesem Fall darf die laufende Datenbank-Transaktion auf keinen Fall beendet werden, denn dies würde das betroffene Objekt ungültig machen und zu einem Absturz des Systems führen. ClassiX verhindert in diesem Fall den Transaktionscommit innerhalb von WaitOnInput, was auch im cx.txn-Logger entsprechend geloggt wird.

Parameter KEEP

WaitOnInput(, KEEP), WaitOnInput(intervall, KEEP)

Parameter: Time-Out-Intervall in Sekunden

Stack
Stack Position Beschreibung
Stack(In) Top -
Stack(Out) Top Werte bei FinishInput

Der einzige Unterschied zu WaitOnInput ohne Parameter KEEP besteht in folgendem:

WaitOnInput(, KEEP) hält eine laufende Datenbank-Transaktion für die gesamte Dauer von WaitOnInput offen. 
Dies kann zu Locking-Konflikten führen!

Beispiele für beide Varianten finden Sie hier.