Hallo,

Wat is de snelste manier om vanuit een programma een ander programma te starten?
Ik heb een test gedaan met een drietal methoden, zie hier onder.
De uitvoer met Button1 is niet te meten. De andere wel. Is er nor een andere manier?
Het bestand Test.Bat bestaat uit een herhaling van het volgende commando: dir d:\*.*

Met een vriendelijke groet, Frans

Code:
UNIT unit2;

{$mode objfpc}{$H+}

INTERFACE

USES Process, Windows,
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, DateUtils;

TYPE

  { TForm1 }

  TForm1 = CLASS(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    PROCEDURE Button1Click(Sender: TObject);
    PROCEDURE Button2Click(Sender: TObject);
    PROCEDURE Button3Click(Sender: TObject);
  PRIVATE

  PUBLIC

  END;

VAR
  Form1: TForm1;
  t1, t2: TDateTime;

IMPLEMENTATION

{$R *.lfm}

PROCEDURE TForm1.Button1Click(Sender: TObject); // niet te meten
VAR
  RunProgram: TProcess;

BEGIN
  Label1.Caption := '';
  T1 := Now();
  RunProgram := TProcess.Create(nil);
  RunProgram.CommandLine := 'test.bat';
  RunProgram.Execute;
  RunProgram.Free;
  T2 := Now();
  Label1.Caption := IntToStr(MilliSecondsBetween(t2, t1));
END;

PROCEDURE TForm1.Button2Click(Sender: TObject);  // 700 msec
VAR
  SCmd1, SCmd2: STRING;
BEGIN
  T1 := Now();
  scmd2 := '';
  scmd1 := 'test.bat';
  ShellExecute(Form1.Handle, PChar('open'), PChar(scmd1), PChar(scmd2), nil, 1);
  T2 := Now();
  Label2.Caption := IntToStr(MilliSecondsBetween(t2, t1));
END;

PROCEDURE ExecVisualProcess(CommandLine: STRING; CurDir: STRING = '';
  Waitfor: BOOLEAN = True);
VAR
  process: TProcess;
BEGIN
  Process := TProcess.Create(nil);
  IF CurDir <> '' THEN
    Process.CurrentDirectory := CurDir;
  Process.CommandLine := CommandLine;
  IF Waitfor THEN
    Process.Options := [poWaitOnExit]
  ELSE
    Process.Options := [];
  Process.Execute;
  IF Waitfor THEN
    Process.Free;
END;

PROCEDURE TForm1.Button3Click(Sender: TObject);   // 8600 msec
BEGIN
  T1 := Now();
  ExecVisualProcess('test.bat', '', True);
  T2 := Now();
  Label3.Caption := IntToStr(MilliSecondsBetween(t2, t1));
END;


END.