anchor.diff:      FCanStartEvent : TSimpleEvent;
       FCanDieEvent : TSimpleEvent;
       FJob : TmJob;
  -  public
  -    constructor Create (aJob : TmJob); reintroduce;
  +    FJobResult : TJobResult;
  +  public
  +    constructor Create (aJob : TmJob; aJobResult : TJobResult); reintroduce;
       destructor Destroy; override;
       procedure Execute; override;
   
  
positive.code:   mUtility, mProgress;
  
  type
    TDoJobProcedure = procedure (aProgress: ImProgress) of object;
    TOnEndCallback = procedure of object;
  
    TmJob = class
    strict private
  
negative.code:   Result := internalBatchExecutor;
  end;
  
  { TJobResults }
  
  procedure TJobResults.Add(aJobResult: TJobResult);
  begin
    FList.Add(aJobResult);
  end;
  
  constructor TJobResults.Create;
  begin
    FList := TObjectList.Create(true);
  end;
  
  destructor TJobResults.Destroy;
  begin
    FList.Free;
    inherited Destroy;
  end;
  
  function TJobResults.Get(aIndex: integer): TJobResult;
  begin
    Result := FList.Items[aIndex] as TJobResult;
  end;
  
  function TJobResults.Count: integer;
  begin
    Result := FList.Count;
  end;
  
  { TJobResult }
  
  constructor TJobResult.Create();
  begin
    FReturnCode:= 0;
    FReturnMessage:= '';
    FReturnData := nil;
    FOwnsData:= false;
  end;
  
  destructor TJobResult.Destroy;
  begin
    if FOwnsData and (Assigned(FReturnData)) then
      FReturnData.Free;
    inherited Destroy;
  end;
  
  { TControlThread }
  
  procedure TControlThread.RunEndCallBack;
  