IR
irwinrodriguez.dev
Zuruck zur Dokumentation

Erweiterte Muster

Gangige Verwendungsmuster fur Fortschrittsberichte, parallele Aufgaben, Ereignisse, Fehlerbehandlung, Stornierung und Aufgabenverkettung.

1. Fortschrittsberichte

Aktualisieren Sie loTask.Progress (0-100) innerhalb der Aufgabenprozedur. Lesen Sie den Wert vom Hauptthread aus mit einem Timer.

* Inside task procedure (MyTasks.prg):
PROCEDURE LongImport(loParams, loTask)
    LOCAL i, lnTotal
    lnTotal = loParams.rowCount
    FOR i = 1 TO lnTotal
        * ... process row i ...
        loTask.Progress = INT((i / lnTotal) * 100)
    NEXT
    loTask.Result = TRANSFORM(lnTotal) + " rows imported."
ENDPROC
* In main thread -- Timer event (interval 500 ms):
PROCEDURE Timer1_Timer
    oProgressBar.Value = loTask.Progress
    IF loTask.Status == "Done" OR loTask.Status == "Failed"
        Timer1.Enabled = .F.
    ENDIF
ENDPROC

2. Parallele Aufgaben mit RunAll

RunAll fuhrt ein Array von Prozedurnamen parallel aus, bis zur MaxWorkers-Grenze. Es gibt ein Array von Task-Objekten zuruck.

LOCAL loCore, laProcs[3], loResults
loCore = CREATEOBJECT("FoxCore.FoxCoreClass")
loCore.MaxWorkers = 3
laProcs[1] = "Task_ImportFile"
laProcs[2] = "Task_GenerateReport"
laProcs[3] = "Task_SendEmails"
loResults = loCore.RunAll(@laProcs)
* loResults is an array of Task objects, one per procedure
? loResults[1].Status
? loResults[2].Status
? loResults[3].Status

3. Ereignis-Callbacks

Weisen Sie einen Prozedurnamen (als String) OnComplete, OnFailed oder OnProgress zu, bevor Sie Run() aufrufen. FoxCore ruft die Prozedur im Hauptthread auf, wenn das Ereignis auftritt.

LOCAL loCore, loParams, loTask
loCore   = CREATEOBJECT("FoxCore.FoxCoreClass")
loParams = CREATEOBJECT("Empty")
ADDPROPERTY(loParams, "filePath", "C:dataimport.csv")

loTask = loCore.Run("Task_ImportCSV", loParams)
loTask.OnComplete = "HandleTaskDone"
loTask.OnFailed   = "HandleTaskError"
loTask.OnProgress = "HandleProgress"

* ...
PROCEDURE HandleTaskDone(loTask)
    MESSAGEBOX("Done: " + loTask.Result)
ENDPROC

PROCEDURE HandleTaskError(loTask)
    MESSAGEBOX("Failed: " + loTask.Error)
ENDPROC

PROCEDURE HandleProgress(loTask)
    oProgressBar.Value = loTask.Progress
ENDPROC

4. Fehlerbehandlung

Wenn die Aufgabenprozedur eine nicht abgefangene Ausnahme auslost, wechselt der Task zu Status="Failed" und loTask.Error enthalt die Nachricht. Prufen Sie immer den Status, bevor Sie Result lesen.

loCore.WaitFor(loTask, 10000)
DO CASE
CASE loTask.Status == "Done"
    ? "Result: " + loTask.Result
CASE loTask.Status == "Failed"
    MESSAGEBOX("Error: " + loTask.Error, 48, "Task Failed")
CASE loTask.Status == "Cancelled"
    ? "Task was cancelled."
ENDCASE

5. Stornierung

Rufen Sie loCore.Cancel(loTask) auf, um die Stornierung anzufordern. Der Task wechselt zu Status="Cancelled". Die Aufgabe sollte den Status regelmaig prufen, wenn sie schnell reagieren mochte.

* Request cancellation from main thread:
loCore.Cancel(loTask)

* Inside the task procedure -- check periodically:
PROCEDURE Task_LongProcess(loParams, loTask)
    LOCAL i
    FOR i = 1 TO 1000
        IF loTask.Status == "Cancelled"
            EXIT
        ENDIF
        * ... do work ...
        loTask.Progress = i / 10
    NEXT
    IF loTask.Status != "Cancelled"
        loTask.Result = "Completed."
    ENDIF
ENDPROC

6. Sequenzielle Aufgaben

Verwenden Sie WaitFor(), um Aufgaben zu verketten: Die zweite Aufgabe erhalt das Ergebnis der ersten als Parameter. Dieses Muster ist nur ausserhalb von UI-Ereignissen sicher.

LOCAL loCore, loParams1, loParams2, loTask1, loTask2
loCore   = CREATEOBJECT("FoxCore.FoxCoreClass")
loParams1 = CREATEOBJECT("Empty")
ADDPROPERTY(loParams1, "source", "https://api.example.com/data")

* Step 1: Fetch remote data
loTask1 = loCore.Run("Task_FetchData", loParams1)
loCore.WaitFor(loTask1, 15000)

IF loTask1.Status == "Done"
    * Step 2: Process the fetched data
    loParams2 = CREATEOBJECT("Empty")
    ADDPROPERTY(loParams2, "data", loTask1.Result)
    loTask2 = loCore.Run("Task_ProcessData", loParams2)
    loCore.WaitFor(loTask2, 10000)
    ? loTask2.Result
ELSE
    ? "Fetch failed: " + loTask1.Error
ENDIF
Speicherisolierung: FoxCore-Aufgaben werden in separaten VFP-Instanzen ausgefuhrt. Sie teilen KEINEN Speicher, globale Variablen oder SET-Befehle mit dem Hauptthread. Ubergeben Sie alle benotigten Daten uber das loParams-Objekt.

Weiter: API-Referenz ->