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.
Bookmarks