Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Basti* am 02.10.12 - 11:55:02
-
Hallo,
ich habe hier ein paar Scripte, die brauchen etwas Zeit bei der Ausführung. Gestartet werden sie per Button in den Ansichten. Dabei wird der Notes Client komplegtt eingefroren. Arbeiten geht für diese Zeit nicht mehr. Ist die Routine mit allem durch, geht auch Notes wieder.
Kann man die Ausführung der Scripte irgendwie in den Hintergrund schieben? Oder gibt es irgend ein Kommando, dass man in Schleifen aufrufen kann, um die Steuerung des Notes Client zu ermöglichen?
Grüße
Basti
-
Hallo,
Nein.
Andreas
-
Mist!
Danke ;)
-
Moin,
je nachdem was die Scripte machen käme vielleicht eine Auslagerung in Agenten mit der Option "Im Hintergrund-Client-Thread ausführen" in Frage?
Gruß
Demian
-
@Demian
Wen ich es aber noch richtig in Erinnerung habe, dann duerfen bei dieser Option des Agenten aber keine Front-End-Klassen referenziert werden.
Andreas
-
Wann spricht man denn von Front-End-Klassen? Sind alle meine eigenen LIBs Front-End-Klassen?
Basti
-
Nein.
FrontEnd-Klassen sidn alle die, die ein UI im Klassennamen tragen.
NotesUIWorkspace
NotesUIDocument
usw.
Andreas
-
@Demian,
Was mir auch noch gerade einfaellt.
Basti* hat auch davon gesprochen, dass die Scripte ueber einen Button in einer Ansicht gestartet werden.
Was machst Du aber dann, wenn es sich bei diesen Scripten NICHT um einen Agenten handelt?
Andreas
-
Nein.
FrontEnd-Klassen sidn alle die, die ein UI im Klassennamen tragen.
AH .. OK! Danke!
D.h. wenn ich in meinen Libs keine UI-Klassen verwende, könnte ich einen Agenten in den Hintergrund schicken? Das klingt doch nach einem Hauch von Hoffnung! :)
Basti
-
@Demian,
[...]
Was machst Du aber dann, wenn es sich bei diesen Scripten NICHT um einen Agenten handelt?
Na, man könnte den Agenten per Formula starten: @Command([RunAgent];"Name d. Agenten"]). Wäre das eine Lösung? Oder greifen dann wieder Spezialdinge?
Basti
-
Ich meinte es aber eher in der Richtung, dass der Code der ausgefuehrt werden soll sich entweder im Button selbst bzw. nur in Routinen aus Bibliotheken zusammensetzt.
Somit hast Du keinen Agenten mehr.
(taucht ja nicht im Designer unter Agenten auf)
Andreas
-
Jeder Code, der direkt in einem Button steht kann auch in einen Agenten mit Ziel "Keines" ausgelagert werden. Insofern ist das nicht wirklich ne Einschränkung (auch wenn es ein wenig zusätzlichen Aufwand bedeutet).
-
D.h. wenn ich in meinen Libs keine UI-Klassen verwende, könnte ich einen Agenten in den Hintergrund schicken? Das klingt doch nach einem Hauch von Hoffnung! :)
Im Prinzip ja, aber es dürfen auch sonst keine Interaktionen mit dem Benutzer stattfinden, also z.B. Eingaben über eine Inputbox gemacht werden oder Ausgaben über eine Messagebox usw.
Axel
-
@Andreas: deswegen habe ich geschrieben "je nachdem was die Scripte machen, käme vielleicht eine Auslagerung....."
Das mit dem Starten über den Button geht dann aber nicht. Dann wird trotzdem blockiert. Nur wenn die Dinger über "Aktionen" gestartet werden laufen se wirklich im Hintergrund. Code aus Script-Libs stellen hierbei aber kein Problem dar?
Beispiel:
Dim i As Integer
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Call ReportInitialize(db,"Ini",s.CommonUserName)
For i = 1 To 5000
Call ReportWrite("Zähler: " & i)
Next
ReportInitialize und ReportWrite sind Funktionen aus ner Script-Lib. Sofern über "Aktionen" gestartet rennt der Agent wie er es soll im Hintergrund und erzeugt die Report-Einträge.
-
Also das mit dem "Start über Buitton geht nicht" ist nur halb richtig: Ich kann natürlich in den Button ein "@Command( [RunAgent] ; "MeinAgent" ) reinschreiben, und der Agent läuft dann im Backend- Client- Thread... Und das einbinden von Script- Libs ist überhaupt kein Problem.
-
Also ich hatte das den Tag getestet. Starte ich den Agent mit dem Code von oben über nen Button auf folgende Weise:
Sub Click(Source As Button)
Dim s As New notessession
Dim db As NotesDatabase
Dim agent As NotesAgent
Set db = s.CurrentDatabase
Set agent = db.GetAgent("Test")
Call agent.RunOnServer
End Sub
blockiert er mir Notes. Habs jetzt aber grad mal mit dem Formelaufruf getestet, da blockiert er nicht. Gut zu wissen ;D
-
Das hätte ich Dir auch sagen können... RunOnServer wartet auf den Rückgabewert des Agenten...