IR
irwinrodriguez.dev
Zuruck zur Dokumentation

Erste Schritte

Ihre erste Hintergrundaufgabe in weniger als 5 Minuten.

Voraussetzungen

  • FoxCore installiert und lizenziert
  • VFP 9 SP2 oder hoher
  • Die Aufgabenklasse muss in einem kompilierten PRG oder einer Klasse in einer APP/DLL sein

1. FoxCoreClass-Instanz erstellen

Instanziieren Sie das Hauptobjekt. Die gesamte Aufgabenverwaltung erfolgt uber dieses Objekt.

LOCAL loCore
loCore = CREATEOBJECT("FoxCore.FoxCoreClass")
? loCore.Version   && prints the installed version

2. Aufgabenprozedur definieren

Die Aufgabenprozedur erhalt zwei Parameter: loParams (Eingabedaten) und loTask (das Task-Objekt zum Melden von Fortschritt und Ergebnis). Sie muss in einem kompilierten PRG sein, nicht im Befehlsfenster.

* MyTasks.prg  (must be SET PROCEDURE TO or compiled into APP)
PROCEDURE MyBackgroundTask(loParams, loTask)
    LOCAL i
    FOR i = 1 TO loParams.iterations
        * Simulate work
        INKEY(0.1)
        loTask.Progress = INT((i / loParams.iterations) * 100)
    NEXT
    loTask.Result = "Done! Processed " + TRANSFORM(loParams.iterations) + " items."
ENDPROC

3. Aufgabe ausfuhren

Rufen Sie Run() mit dem Prozedurnamen und dem Parameter-Objekt auf. Der Aufruf kehrt sofort mit einem Task-Objekt zuruck.

LOCAL loCore, loParams, loTask
loCore   = CREATEOBJECT("FoxCore.FoxCoreClass")
loParams = CREATEOBJECT("Empty")
ADDPROPERTY(loParams, "iterations", 50)
loTask = loCore.Run("MyBackgroundTask", loParams)
? loTask.Id      && GUID of the new task
? loTask.Status  && "Pending" or "Running"

4. Status prufen (nicht-blockierend)

Verwenden Sie die Status-Eigenschaft des Tasks, um den aktuellen Zustand zu ermitteln. Das gebrauchlichste Muster ist, sie in einem Timer-Ereignis zu lesen, um die Benutzeroberflache nicht zu blockieren.

* Poll in a Timer event (interval 500 ms recommended)
IF loTask.Status == "Done"
    MESSAGEBOX(loTask.Result)
ENDIF
IF loTask.Status == "Failed"
    MESSAGEBOX("Error: " + loTask.Error)
ENDIF
* Progress bar update:
oProgressBar.Value = loTask.Progress

5. Auf Ergebnis warten (blockierend)

WaitFor() blockiert die Ausfuhrung, bis die Aufgabe abgeschlossen ist oder das Timeout ablauft. Verwenden Sie dies in Skripten, Tests oder Batch-Prozessen, niemals in einem UI-Ereignis.

* Wait up to 5 seconds (5000 ms)
loCore.WaitFor(loTask, 5000)
IF loTask.Status == "Done"
    ? loTask.Result
ELSE
    ? "Task did not complete in time: " + loTask.Status
ENDIF
Warnung: Rufen Sie WaitFor() niemals innerhalb eines UI-Ereignishandlers (Click, Timer usw.) auf - VFP wird eingefroren. Verwenden Sie es nur in Hintergrundskripten oder Tests.

Weiter: Erweiterte Muster -- API-Referenz