IR
irwinrodriguez.dev
Zurück zur Dokumentation

Schnellstart

Von null zu Ihrer ersten Aufgabe in einem anderen Visual-FoxPro-Prozess, in funf Schritten. Gultig fur FoxCore.Runtime 3.4.2.

Bevor Sie anfangen

  • FoxCore.Runtime 3.4.2 installiert und registriert: der Installer FoxCore.Runtime-Setup-3.4.2.exe erledigt das und bringt verify.cmd zur Prufung mit. Siehe Installation.
  • Visual FoxPro 9 SP2, als Automatisierungsserver registriert - das ist der Prozess, der die Aufgaben ausführt. Seit 3.1.0 kann es ein anderer sein: VFP Advanced oder Ihre eigene .exe.
  • Ihre Lizenz, ein JWT: aus dem Kundenportal herunterladen und per Code ubergeben. Siehe Lizenzierung.

1. Prüfen, dass die Engine da ist

Zuerst, dass das COM-Objekt erzeugt wird. Schlägt das fehl, liegt es an der Installation und nicht an Ihrem Code: keine der folgenden Zeilen wird funktionieren.

Die Runtime erzeugen und prüfen, dass sie antwortet
LOCAL loRt
loRt = CREATEOBJECT("FoxCore.Runtime")
? loRt.Ping()                             && FoxCore.Runtime 3.4.2

2. Lizenz aktivieren - und das .T. prüfen

Activate() wirft bei einer ungültigen Lizenz NIE: es liefert .F. und macht weiter. Wer es aufruft und den Rückgabewert nicht ansieht, startet die Engine trotzdem und merkt es viel später, wenn die erste Aufgabe als Failed geboren wird.

Die Lizenz aktivieren und das .T. prüfen
LOCAL lcJwt
lcJwt = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...."   && hier den JWT aus Ihrem Kundenportal einfügen

IF !loRt.Activate(lcJwt)
    MESSAGEBOX("La licencia de FoxCore no es valida.", 16, "FoxCore")
    RETURN
ENDIF
? loRt.IsLicensed                         && .T.

Wenn Sie diesen Schritt auslassen, funktioniert der Lebenszyklus weiter - Attach, Ping, Shutdown -, aber jede Aufgabe wird als Failed geboren, mit genau dieser Meldung:

Die Meldung einer Aufgabe ohne Lizenz
FoxCore.Runtime: no hay una licencia valida para el producto 'FoxCore', asi que la tarea no se ejecuta. Activala por codigo al arrancar: loRt.Activate(<tu JWT>). Se consigue en https://irwinrodriguez.dev/products/foxcore

3. Anbinden, starten und pumpen

Das ist der ganze Zyklus, und es ist derselbe Ausschnitt, der die API-Referenz eroffnet. Attach() bindet die Runtime AN DEN THREAD, aus dem Sie es aufrufen. RunScript() liefert die ID sofort: das Skript läuft bereits in einem anderen Prozess. Und Pump() bedient die Worker - ohne es warten sie nur.

Der ganze Zyklus: aktivieren, anbinden, starten und pumpen
LOCAL loRt, lcId

loRt = CREATEOBJECT("FoxCore.Runtime")
? loRt.Activate(lcJwt)                    && .T. -- Ihre Lizenz, als Zeichenkette
loRt.Attach(_VFP)                         && bindet die Runtime AN DIESEN Thread
loRt.MaxWorkers = 8

lcId = loRt.RunScript("RETURN 6 * 42", "la primera")   && das Skript läuft in einem ANDEREN VFP-Prozess

DO WHILE !loRt.IsCompleted(lcId)
    loRt.Pump()                           && Pump() bedient die Worker; ohne es warten sie nur
    DOEVENTS
ENDDO

? loRt.GetState(lcId)                     && Completed
? loRt.GetResult(lcId)                    && 252
? loRt.GetError(lcId)                     && ""

loRt.Shutdown()                           && IMMER: es beendet die Worker
Pump() nur aus dem Attach-Thread: Pump() aus einem anderen Thread aufzurufen, erzeugt einen kontrollierten Fehler. Und innerhalb eines Handlers tritt ein DOEVENTS erneut in Pump() ein: es liefert 0, tut nichts und wirft nicht, bedient also niemanden. In einem Formular gehört Pump() in einen Timer.

4. Das Ergebnis abholen

GetResult() liefert, was das Skript per RETURN übergeben hat. Solange die Aufgabe nicht erfolgreich beendet ist, liefert es .NULL., also prüfen Sie zuerst den Zustand.

Ergebnis oder Fehler der Aufgabe abholen
IF loRt.GetState(lcId) == "Completed"
    ? loRt.GetResult(lcId)                && was das Skript zuruckgab
ELSE
    ? loRt.GetError(lcId)                 && leer, wenn kein Fehler
ENDIF

5. Immer mit Shutdown() schließen

Shutdown() beendet die Worker-Prozesse. Es ist idempotent: zweimal aufrufen schadet nicht. Ohne den Aufruf bleiben verwaiste vfp9.exe-Prozesse ubrig und belegen Speicher - und das ist der häufigste Weg, sich das hier kaputtzumachen.

Die Runtime und ihre Worker schließen
loRt.Shutdown()

Und ab hier

  • Muster - der grosse Stapel, Fortschritt mit Balken und Abbrechen-Schaltflache, Handler, die Tafel, und wie das kaputtgeht.
  • Beispiele - drei vollstandige Programme zum Kopieren und Ausfuhren.
  • API-Referenz - die sechs Typen und alle ihre Mitglieder, mit dem, was jedes bei einem Fehler liefert.
Kommen Sie von der klassischen Engine? Wenn Ihr Code CREATEOBJECT("FoxCore.FoxCoreClass") sagt, ist das die andere Engine - sie existiert weiter und wird weiter unterstutzt, aber sie ist nicht die, die diese Seite beschreibt. Die Entsprechungstabelle steht in "Was es nicht mehr gibt", am Ende der Referenz.

Weiter: Erweiterte Muster ->