program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp, Process
  { you can add units after this };

type

  { TMyApplication }

  TMyApplication = class(TCustomApplication)
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
    procedure WriteHelp; virtual;
  end;

{ TMyApplication }

procedure TMyApplication.DoRun;
var
  ErrorMsg: String;

  Processes: array of TProcess;
  i, c, a:integer;

begin

  // quick check parameters
  ErrorMsg:=CheckOptions('h','help');
  if ErrorMsg<>'' then begin
    ShowException(Exception.Create(ErrorMsg));
    Terminate;
    Exit;
  end;

  // parse parameters
  if HasOption('h','help') then begin
    WriteHelp;
    Terminate;
    Exit;
  end;

  a := 5;
  SetLength(Processes, a);
  for i := 0 to a - 1 do
  begin
    Processes[i] := TProcess.Create(Self);
    {$WARNING SET THIS PATH}
    //Processes[i].CommandLine := 'C:/mufasa/Projects/MufasaTests/project1.exe';
    Processes[i].CommandLine := '/home/merlijn/Programs/mufasa/Projects/MufasaTests/project1';
    //Processes[i].ApplicationName := 'ForkingTest: ' + inttostr(i);
    Processes[i].Execute;
    sleep(100);
    Writeln('Process ' + inttostr(i) + ', has ID ' + inttostr(Processes[i].ProcessID));
  end;

  sleep(10000);
  while true do
  begin
    c := 0;
    for i := 0 to a - 1 do
    begin
      if not Processes[i].Running then
        c := c + 1;
    end;
    if c = a then
      break;
    sleep(1000);
  end;

  for i := 0 to a - 1 do
  begin
    Processes[i].Free;
  end;
  { add

  end;
  your program here }

  // stop program loop
  writeln('done');
  Terminate;
end;

constructor TMyApplication.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  StopOnException:=True;
end;

destructor TMyApplication.Destroy;
begin
  inherited Destroy;
end;

procedure TMyApplication.WriteHelp;
begin
  { add your help code here }
  writeln('Usage: ',ExeName,' -h');
end;

var
  Application: TMyApplication;

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

begin
  Application:=TMyApplication.Create(nil);
  Application.Title:='My Application';
  Application.Run;
  Application.Free;
end.

