Announcement

Collapse
No announcement yet.

Fremde Anwendung starten

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

  • Fremde Anwendung starten

    Hallo,

    Umg.: Delphi 6 Ent. UP2

    Ich möchte von meiner Anwendung heraus eine andere Anwendung, genau genommen eine Batch-Datei, starten. Diese Batch-Datei wird einige Jobs erledigen, die durchaus mehrere Stunden dauern können. Dabei soll innerhalb der eigenen Anwendung bei einem OnButtonClick folgendes passieren:
    - Starten der Batch-Datei und festhalten der Startzeit (Datum & Zeit)
    - Zur Anwendung zurückkehren, um dort normal weiterarbeiten zu können (das Child-Fenster, vom dem aus der Batchaufruf erfolgte, wird offen bleiben)
    - Nachdem die Batch-Datei ihre Arbeit verrichtet hat, soll die eigene Anwendung die Endzeit (Datum & Zeit) anzeigen, sowie weitere Aktionen veranlassen, die mit dem Ende der Stapelverarbeitung (Batch) verbunden sind.

    Wie kann/soll ich dies am sinnvollsten lösen?

    Danke im voraus
    Stephan

  • #2
    Das Starten und das Überwachen des Prozesses könntest Du mittels der API-Funktion CreateProcess in einem eigenen Prozess durchführen

    Comment


    • #3
      Hallo Bernhard

      ich habe mir folgende kleine Funktion geschrieben, mit der ich andere Anwendungen starten kann:<pre><code>function ExecAppAndWait(const sApp, sParams: String; wShow: Word; bWait: Boolean = True): Cardinal;
      var
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
      hProc: THandle;
      CmdLine: String;
      begin
      FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
      StartupInfo.cb := SizeOf(TStartupInfo);
      StartupInfo.wShowWindow := wShow;
      CmdLine := sApp + ' ' + sParams;
      Win32Check(CreateProcess(nil, PChar(CmdLine), nil, nil, False,
      NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo));
      hProc := ProcessInfo.hProcess;
      CloseHandle(ProcessInfo.hThread);
      if bWait then
      if WaitForSingleObject(hProc, INFINITE) <> WAIT_FAILED then
      GetExitCodeProcess(hProc, Result);
      CloseHandle(hProc);
      end;</pre></code>

      Nur weiß ich leider nicht, wie auf das Ende dieser Batch-Datei reagieren soll?

      In meinem OnButtonClick steht dann folgendes:
      <pre><code>// Startzeit
      Label1.Caption := DateTimeToStr(Now);
      // Batchbetrieb starten
      ExecAppAndWait('MyBatch.bat', '', False, False);
      // Endezeit
      Label2.Caption := DateTimeToStr(Now);
      </pre></code>

      Wenn ich auf die Batchdatei 'warte', dann ist meine eigene Anwendung blockiert, wenn ich nicht darauf warte, dann stimmt die Endezeit nicht, da das Programm sofort zum Aufrufer zurückkehrt, während der Batchbetrieb noch still und leise vor sich hin läuft

      Comment


      • #4
        Den Start der EXE in einen Thread auslagern sollte helfen

        Comment


        • #5
          Mit dem Aufruf der EXE meinst Du 'meine' aufzurufende Batch-Datei, oder?

          Wenn ich aber threadbasiert arbeite, dann muss ich doch auch die Aktionen, die z.B. die Zeit ermitteln und darstellen, ebenfalls in einen eigenen Thread auslagern, da ich dafür ja den Hauptthread nicht 'missbrauchen' kann?

          Dies müsste für OnButtonClick wie folgt aussehen:

          Die Anwendung startet einen Thread#1, der nichts anderes macht als die Batchdatei zu starten. Das Handle des Threads speichere ich bspw. in einer Variablen namens hThrd. Anschließend starte ich einen zweiten Thread#2, der in seiner Execute-Methode folgendes macht:

          if hThrd <> INVALID_HANDLE_VALUE then
          if WaitForSingleObject(hThrd, INFINITE) <> WAIT_OBJECT then
          Terminate;
          if not Terminated then
          Ermittle_Zeit;
          Aktualisiere_Labels;
          Irgendwelche_Aktionen;

          Simmt das in etwa so, oder habe ich irgendwas nicht beachtet

          Comment


          • #6
            Hi Stephan,<br>du startest einen Thread. im OnStart dieses Thread rufst du Execandwait auf, wodurch dies alles im Thread gekapselt ist und das Programm weiterlaufen lässt. Über einen Timer o.ä. kannst du die Ausführungszeit darstellen.<br>Ich verwende übrigens gerne die ONETHREAD-Komponente (google mal) cu Michae

            Comment


            • #7
              Nun habe ich ein Problem:

              Der eigentliche Inhalt der Batch-Datei wird nicht ausgeführt.
              <br>Starte ich die Batch-Dateien manuell, so wird alles ordnungsgemäß erledigt. Starte ich hingegen die Batch-Dateien von meinem Programm aus, genau genommen vom Thread aus, dann klappt's leider nicht.
              <br>Ändere ich den Inhalt der Batch-Datei, z.B. in C:\Windows\notepad.exe, so funktioniert's. Notepad erscheint und erst wenn ich notepad schließe, reagiert der nächste Thread usw. So wie ich es mir vorstelle und wie es sein sollte.
              <br>Da es testweise mit notepad.exe klappt, mit dem 'echten' Inhalt der Batch-Datei aber nicht, stellt sich mir die Frage: Woran kann das liegen?
              <br>Nachtrag: Da die Programme, die in den Batch-Dateien stehen, nicht aus meiner Feder stammen, kann ich leider wenig zu ihnen sagen. Es handelt sich aber um Konsolenanwendungen

              Comment

              Working...
              X