{$MODE OBJFPC}
{$MODESWITCH AUTODEREF}
uses
  dtaskque,
  SysUtils;

type
TPrintString = object(ITask)
  procedure Execute; virtual;
end;

procedure TPrintString.Execute;
begin
  Writeln(PAnsiChar(Obj));
  Sleep(1000);
end;

function PrintStringTask(P: PAnsiChar): TPrintString; inline;
begin
  Result.Init(P);
end;

var
  Q1, Q2: TTaskQue;

begin
  Q1.Init;
  Q1.AddTask(PrintStringTask('Q1: Hello world!'));
  Q1.AddTask(PrintStringTask('Q1: aaa'));
  Q1.AddTask(PrintStringTask('Q1: bbb'));

  Q2.Init;
  Q2.AddTask(PrintStringTask('Q2: Hello world!'));
  Q2.AddTask(PrintStringTask('Q2: aaa'));
  Q2.AddTask(PrintStringTask('Q2: bbb'));

  Q1.Run(True);
  Q2.Run(True);

  Q1.WaitAll;
  Q2.WaitAll;

  Q1.Done;
  Q2.Done;
end.
