Sample code for 30+ languages & platforms
PureBasic

Async Task Chain (another example)

See more Async Examples

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

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkFtp2.pb"
IncludeFile "CkTask.pb"
IncludeFile "CkTaskChain.pb"

Procedure ChilkatExample()

    success.i = 0

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

    success = 0

    ftp.i = CkFtp2::ckCreate()
    If ftp.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkFtp2::setCkHostname(ftp, "ftp.example.com")
    CkFtp2::setCkUsername(ftp, "login")
    CkFtp2::setCkPassword(ftp, "password")

    ; Connect and login to the FTP server.
    success = CkFtp2::ckConnect(ftp)
    If success <> 1
        Debug CkFtp2::ckLastErrorText(ftp)
        CkFtp2::ckDispose(ftp)
        ProcedureReturn
    EndIf

    taskChain.i = CkTaskChain::ckCreate()
    If taskChain.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Create a task to change to the remote directory where the file will be uploaded.
    task.i = CkFtp2::ckChangeRemoteDirAsync(ftp,"junk")
    If CkFtp2::ckLastMethodSuccess(ftp) = 0
        Debug CkFtp2::ckLastErrorText(ftp)
        CkFtp2::ckDispose(ftp)
        CkTaskChain::ckDispose(taskChain)
        ProcedureReturn
    EndIf

    ; Add this task to the task chain.
    success = CkTaskChain::ckAppend(taskChain,task)
    CkTask::ckDispose(task)

    ; Create a task to upload a file.
    localFilename.s = "c:/temp/hamlet.xml"
    remoteFilename.s = "hamlet.xml"

    task = CkFtp2::ckPutFileAsync(ftp,localFilename,remoteFilename)
    If CkFtp2::ckLastMethodSuccess(ftp) = 0
        Debug CkFtp2::ckLastErrorText(ftp)
        CkFtp2::ckDispose(ftp)
        CkTaskChain::ckDispose(taskChain)
        ProcedureReturn
    EndIf

    ; Add this task to the task chain.
    success = CkTaskChain::ckAppend(taskChain,task)
    CkTask::ckDispose(task)

    ; 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.
    CkTaskChain::setCkStopOnFailedTask(taskChain, 1)
    success = CkTaskChain::ckRun(taskChain)
    If Not success
        Debug CkTaskChain::ckLastErrorText(taskChain)
        CkFtp2::ckDispose(ftp)
        CkTaskChain::ckDispose(taskChain)
        ProcedureReturn
    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. 
    While CkTaskChain::ckFinished(taskChain) <> 1

        ; Sleep 100 ms.
        CkTaskChain::ckSleepMs(taskChain,100)

    Wend

    ; 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 CkTaskChain::ckStatusInt(taskChain) <> 7
        Debug "Task did not complete."
        Debug "task chain status: " + CkTaskChain::ckStatus(taskChain)
        CkFtp2::ckDispose(ftp)
        CkTaskChain::ckDispose(taskChain)
        ProcedureReturn
    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..
    numTasks.i = CkTaskChain::ckNumTasks(taskChain)
    taskIdx.i = 0

    While (taskIdx < numTasks)

        task = CkTaskChain::ckGetTask(taskChain,taskIdx)

        ; 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.
        Debug "task status: " + CkTask::ckStatus(task)
        Debug "task log: " + CkTask::ckResultErrorText(task)

        CkTask::ckDispose(task)

        taskIdx = taskIdx + 1
    Wend

    success = CkFtp2::ckDisconnect(ftp)


    CkFtp2::ckDispose(ftp)
    CkTaskChain::ckDispose(taskChain)


    ProcedureReturn
EndProcedure