Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Cancel Async Task if not Completed after a Max Time

See more Async Examples

Demonstrates how to wait a maximum amount of time for an asynchronous task to completed. If not completed in the allotted amount of time, the task is cancelled.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Task,
  Chilkat.Http;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  http: THttp;
  waitMaxMs: Integer;
  downloadUrl: string;
  task: TTask;
  wasCanceled: Boolean;

begin
  success := False;

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

  http := THttp.Create;

  //  Set some timeouts, in seconds:
  http.ConnectTimeout := 15;
  http.ReadTimeout := 15;

  //  Wait a max time of 2 seconds for the task.
  //  In this example, it's an unreasonably small amount of time,
  //  which means the task will get cancelled.
  waitMaxMs := 2000;

  //  We're just going to download for 2 seconds and then cancel.
  //  Substitute your own URL with a large enough file for testing..
  downloadUrl := 'http://download.mono-project.com/archive/4.6.1/windows-installer/mono-4.6.1.5-gtksharp-2.12.38-win32-0.msi';

  task := http.DownloadAsync(downloadUrl,'qa_output/mono.msi');
  task.Run();

  //  Wait a maximum of waitMaxMs for the task (i.e. the HTTP download) to complete.
  //  The Wait method returns when the task has been canceled, aborted, or completed, or when the max allotted time has passed.
  task.Wait(waitMaxMs);

  //  At this point, the download may or may not have completed.  
  //  Rather than checking the Task status, we can call task.Cancel because
  //  if the Task is no longer running (because it already completed, was canceled or aborted), then the 
  //  call to Cancel is a NO-OP (meaning it does nothing and the Task's status is unaffected).
  //  Also, task.Cancel returns True if the task was in the "queued" or "running" state and was canceled or aborted. 
  //  The method returns False if the task has any other status.
  wasCanceled := task.Cancel();
  if (wasCanceled = True) then
    begin
      WriteLn('The HTTP download took too long and was canceled.');
    end
  else
    begin
      //  Find out what happened.
      if (task.StatusInt = 7) then
        begin
          //  The task completed, which means the background thread's call to Download completed
          //  with success or failure.  Find out which...
          success := task.GetResultBool();
          if (success = True) then
            begin
              WriteLn('Download successful!');
            end
          else
            begin
              WriteLn('Download failed prior to waitMaxMs...');
              WriteLn(task.ResultErrorText);
            end;
        end
      else
        begin
          //  The task must've been canceled or aborted by some other means..
          WriteLn('Task did not complete.  Final status: ' + task.Status);
        end;
    end;

  task.Free;


  http.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.