Sample code for 30+ languages & platforms
Visual FoxPro

Async Task Chain (another example)

See more Async Examples

Demonstrates using a task chain to run a sequence of FTP tasks asynchronously.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loFtp
LOCAL loTaskChain
LOCAL loTask
LOCAL lcLocalFilename
LOCAL lcRemoteFilename
LOCAL lnNumTasks
LOCAL lnTaskIdx

lnSuccess = 0

* This example assumes the Chilkat API to have been previously unlocked.
* See Global Unlock Sample for sample code.

lnSuccess = 0

loFtp = CreateObject('Chilkat.Ftp2')

loFtp.Hostname = "ftp.example.com"
loFtp.Username = "login"
loFtp.Password = "password"

* Connect and login to the FTP server.
lnSuccess = loFtp.Connect()
IF (lnSuccess <> 1) THEN
    ? loFtp.LastErrorText
    RELEASE loFtp
    CANCEL
ENDIF

loTaskChain = CreateObject('Chilkat.TaskChain')

* Create a task to change to the remote directory where the file will be uploaded.
loTask = loFtp.ChangeRemoteDirAsync("junk")
IF (loFtp.LastMethodSuccess = 0) THEN
    ? loFtp.LastErrorText
    RELEASE loFtp
    RELEASE loTaskChain
    CANCEL
ENDIF

* Add this task to the task chain.
lnSuccess = loTaskChain.Append(loTask)
RELEASE loTask

* Create a task to upload a file.
lcLocalFilename = "c:/temp/hamlet.xml"
lcRemoteFilename = "hamlet.xml"

loTask = loFtp.PutFileAsync(lcLocalFilename,lcRemoteFilename)
IF (loFtp.LastMethodSuccess = 0) THEN
    ? loFtp.LastErrorText
    RELEASE loFtp
    RELEASE loTaskChain
    CANCEL
ENDIF

* Add this task to the task chain.
lnSuccess = loTaskChain.Append(loTask)
RELEASE loTask

* Start the task chain running in a background thread.
* Each task is run one after the other (on the same background thread) until all tasks have completed.
* The task chain will stop at the first task that fails.
loTaskChain.StopOnFailedTask = 1
lnSuccess = loTaskChain.Run()
IF (NOT lnSuccess) THEN
    ? loTaskChain.LastErrorText
    RELEASE loFtp
    RELEASE loTaskChain
    CANCEL
ENDIF

* The application is now free to do anything else
* while the FTP commands are being run...

* For this example, we'll simply sleep and periodically
* check to see if the taskchain if finished. 
DO WHILE loTaskChain.Finished <> 1

    * Sleep 100 ms.
    loTaskChain.SleepMs(100)

ENDDO

* A finished task chain could be one that was canceled, aborted, or truly finished.  

* If the task chain "completed", then it ran to completion.  A "completed" task will
* have a StatusInt equal to 7.   If the task finished, but was not completed, then it must've
* been aborted or canceled:
IF (loTaskChain.StatusInt <> 7) THEN
    ? "Task did not complete."
    ? "task chain status: " + loTaskChain.Status
    RELEASE loFtp
    RELEASE loTaskChain
    CANCEL
ENDIF

* If we got to this point, the ChangeRemoteDir and PutFile were successful.
* We can visually verify by examining the LastErrorText that was recorded for each
* of these method calls..
lnNumTasks = loTaskChain.NumTasks
lnTaskIdx = 0

DO WHILE (lnTaskIdx < lnNumTasks)

    loTask = loTaskChain.GetTask(lnTaskIdx)

    * Examine the status of this task, and the ResultErrorText
    * (the ResultErrorText is the ftp.LastErrorText captured for FTP method called by the task).
    * Everything should indicate success.
    ? "task status: " + loTask.Status
    ? "task log: " + loTask.ResultErrorText

    RELEASE loTask

    lnTaskIdx = lnTaskIdx + 1
ENDDO

lnSuccess = loFtp.Disconnect()

RELEASE loFtp
RELEASE loTaskChain