Results 1 to 2 of 2

Thread: Snelheid uitvoeren van een programma in een ander programma

  1. #1

    Snelheid uitvoeren van een programma in een ander programma

    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.

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,703
    Manier 1 en 3 zijn hetzelfde, alleen is bij manier 3 aangegeven dat hij moet wachten totdat het proces klaar is: de eerste start hem en keert dan direct terug.
    Je zal zien dat, wanneer je de boolean parameter in ExecVisualProcess() op FALSE zet, hij (bijna) net zo snel is als bij manier 1.

    Manier 2 is de oude vertrouwde ShellExecute: deze "Wacht" ook een beetje totdat hij weet of het gelukt is om het proces te starten.
    Eigenlijk doet manier 2 het werk in twee stappen: eerst kijkt hij in het register wat hij moet doen ("open") met het bestand met de opgegeven extensie (*.bat) en dan voert hij dat uit.
    ShellExecute wacht echter niet totdat het process klaar is.

    Overigens geeft die ExecVisualProcess een memory leak als WaitFor TRUE is (Process wordt niet meer vrijgegeven), maar dit terzijde.
    Je kunt je ook afvragen of methode 1 wel doet wat 'ie moet doen: wordt het process niet gekilled zodra deze wordt vrijgegeven?
    TMemoryLeak.Create(Nil);

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •