Announcement

Collapse
No announcement yet.

Startzeit einer Fremdapplikation

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Startzeit einer Fremdapplikation

    Hallo zusammen

    Ich muss auf verschiedenen Systemen messen, wie lange es dauert eine Applikation zu starten (z.B. Word, Excel, Notes, etc.).

    Ich starte die Applikation über CreateProcess. Nur wie kann ich feststellen, wann die Applikation "fertig gestartet" ist? Mittels WaitForSingleObject kann ich ja nur feststellen, wann sie wieder beendet wurde.

    Danke für Eure Hilfe
    Roli Heini

  • #2
    Anbei zwei Funktionen aus der Jedi Code Library (http://delphi-jedi.org link 'Code Library')<br>
    Die eine startet ein Programm, die andere wartet auch noch auf das Programmende.<br>
    Wenn Du den Zeitmessungsbeginn vor CreateProcess und das Ende nach WaitForInputIdle einfügst, dann solltest du genau das bekommen was du willst.<br>

    <code>
    function WinExec32(const Cmd: string; const CmdShow: Integer): Boolean;
    var
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    begin
    FillChar(StartupInfo, SizeOf(TStartupInfo), #0);
    StartupInfo.cb := SizeOf(TStartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := CmdShow;
    Result := CreateProcess(nil, PChar(Cmd), nil, nil, False,
    NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);
    if Result then
    begin
    WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
    end;
    end;

    //------------------------------------------------------------------------------

    function WinExec32AndWait(const Cmd: string; const CmdShow: Integer): Cardinal;
    var
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    begin
    Result := Cardinal($FFFFFFFF);
    FillChar(StartupInfo, SizeOf(TStartupInfo), #0);
    StartupInfo.cb := SizeOf(TStartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := CmdShow;
    if CreateProcess(nil, PChar(Cmd), nil, nil, False, NORMAL_PRIORITY_CLASS,
    nil, nil, StartupInfo, ProcessInfo) then
    begin
    WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
    if WaitForSingleObject(ProcessInfo.hProcess, INFINITE) = WAIT_OBJECT_0 then
    begin
    {$IFDEF DELPHI3}
    if not GetExitCodeProcess(ProcessInfo.hProcess, Integer(Result)) then
    {$ELSE}
    if not GetExitCodeProcess(ProcessInfo.hProcess, Result) then
    {$ENDIF DELPHI3}
    Result := Cardinal($FFFFFFFF);
    end;
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
    end;
    end;
    </code&gt

    Comment


    • #3
      Scheiss-Eingabe hier. Da musst du den Umbruch wohl selber wieder reinquetchen

      Comment


      • #4
        Nee, einfach davor ein pre und abschliessend ein /pre Tag

        Comment


        • #5
          <pre>

          function WinExec32(const Cmd: string; const CmdShow: Integer): Boolean;
          var
          StartupInfo: TStartupInfo;
          ProcessInfo: TProcessInformation;
          begin
          FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
          StartupInfo.cb := SizeOf(TStartupInfo);
          StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
          StartupInfo.wShowWindow := CmdShow;
          Result := CreateProcess(nil, PChar(Cmd), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);
          if Result then
          begin
          WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
          CloseHandle(ProcessInfo.hThread);
          CloseHandle(ProcessInfo.hProcess);
          end;
          end;

          </pre&gt

          Comment

          Working...
          X