IR
irwinrodriguez.dev
Volver a documentacion

Primeros pasos

Tu primera tarea en segundo plano en menos de 5 minutos.

Prerrequisitos

  • FoxCore instalado y con licencia activa
  • VFP 9 SP2 o superior
  • La clase de tarea debe estar en un PRG compilado o en una clase dentro de un APP/DLL

1. Crear una instancia de FoxCoreClass

Instancia el objeto principal. Toda la gestion de tareas se realiza a traves de este objeto.

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

2. Definir el procedimiento de tarea

El procedimiento de tarea recibe dos parametros: loParams (datos de entrada) y loTask (el objeto Task para reportar progreso y resultado). Debe estar en un PRG compilado, no en la ventana de comandos.

* 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. Ejecutar la tarea

Llama a Run() con el nombre del procedimiento y el objeto de parametros. La llamada retorna inmediatamente con un objeto Task.

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. Comprobar el estado (sin bloqueo)

Usa la propiedad Status del Task para saber el estado actual. Lo mas usual es leerla en un evento Timer para no bloquear la UI.

* 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. Esperar el resultado (con bloqueo)

WaitFor() bloquea la ejecucion hasta que la tarea termina o se supera el timeout. Usa esto en scripts, tests o procesos batch, nunca en un evento de UI.

* 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
Advertencia: Nunca llames a WaitFor() dentro de un evento de interfaz de usuario (Click, Timer, etc.) -- congelara VFP. Usalo solo en scripts de fondo o tests.

Siguiente: Patrones avanzados -- Referencia API