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 Weiter: API-Referenz ->