[gelöst] Batch ausführen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Adrian
Beiträge: 31
Registriert: Mo 12. Nov 2007, 12:41
OS, Lazarus, FPC: Winux (L 2.0.6 FPC 3.0.4)
CPU-Target: 64Bit

[gelöst] Batch ausführen

Beitrag von Adrian »

Servus!

Bei meinem Programm erstelle ich eine Batch-Datei, die ich auch von der Anwendung heraus starte.
Das mache ich mit folgendem Konstrukt:

Code: Alles auswählen

  AktionsMemo.Lines.Add('Die Umsetzung läuft ...');
  Application.ProcessMessages;
  AProcess := TProcess.Create(nil);
  AProcess.Executable:= 'Umsetzer.bat';
  AProcess.Options := AProcess.Options + [poWaitOnExit];
  AProcess.Execute;
  AProcess.Free;
  DeleteFile('Umsetzer.bat');
  AktionsMemo.Lines.Add('Umsetzung beendet.');
Die Abarbeitung kann mehrere Minuten dauern. Wenn ich nun während dieser Zeit andere Fenster öffne, die mein ursprüngliches Programmfenster (teilweise) überdecken, dann bleiben diese Bereiche nach dem Schließen oder Verschieben des anderen Fensters so lange weiß, bis die Batch-Datei beendet ist. Und das gefällt mir ganz und gar nicht.
Gibt es eine Möglichkeit - und wenn ja, welche - das ursprüngliche Programmfester alle paar Sekunden aufzufrischen?
Wie würde das unter Linux funktionieren?
Gibt es eine bessere Möglichkeit die Batch-Datei zu aktivieren als TProcess?

Gruß
Adrian
Zuletzt geändert von Adrian am Sa 23. Apr 2022, 21:11, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Batch ausführen

Beitrag von Socke »

Adrian hat geschrieben:
Do 21. Apr 2022, 21:55
Gibt es eine Möglichkeit - und wenn ja, welche - das ursprüngliche Programmfester alle paar Sekunden aufzufrischen?
Dein Programm wartet darauf, dass deine Batch-Datei fertig wird (poWaitOnExit). Daher kann es währenddessen nichts anderes tun.
Du musst also die Batch-Datei ohne poWaitOnExit starten und an anderer Stelle dessen Ende überprüfen.

Das geht z.B. über das Event OnRunCommandEvent.

Code: Alles auswählen

begin
  AktionsMemo.Lines.Add('Die Umsetzung läuft ...');
  Application.ProcessMessages;
  AProcess := TProcess.Create(nil);
  AProcess.Executable:= 'Umsetzer.bat';
  AProcess.Options := AProcess.Options;
  AProcess.OnRunCommandEvent  := @DoHandleRunCommandEvent;
  AProcess.Execute;
end;

procedure TForm1.DoHandleRunCommandEvent(Sender, Context: TObject;
  Status: TRunCommandEventCode; const Message: string);
begin
  if Status = RunCommandFinished then
  begin
    AProcess.Free;
    DeleteFile('Umsetzer.bat');
    AktionsMemo.Lines.Add('Umsetzung beendet.');
  end;
end;    
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Adrian
Beiträge: 31
Registriert: Mo 12. Nov 2007, 12:41
OS, Lazarus, FPC: Winux (L 2.0.6 FPC 3.0.4)
CPU-Target: 64Bit

Re: Batch ausführen

Beitrag von Adrian »

Hallo Socke,

vielen Dank für die Antwort.
Es liegt also am poWaitOnExit. Ich muß mir allerdings eine andere Lösung als die von dir vorgeschlagene suchen, denn ich arbeite noch mit Version 2.0.6 und fpc 3.0.4, da gibts das OnRunCommandEvent noch nicht.
Da ich aber nun die Ursache kenne, werde ich schon etwas passendes finden.

Gruß
Adrian

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 169
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Batch ausführen

Beitrag von Jorg3000 »

Hi!
Ohne poWaitOnExit starten und nach .Execute folgende Warteschleife einbauen (ungetestet)

Code: Alles auswählen

while AProcess.running do
begin
 Application.ProcessMessages;
 Sleep(50);
end;

Adrian
Beiträge: 31
Registriert: Mo 12. Nov 2007, 12:41
OS, Lazarus, FPC: Winux (L 2.0.6 FPC 3.0.4)
CPU-Target: 64Bit

Re: Batch ausführen

Beitrag von Adrian »

Hallo Jorg3000,

du kannst es als "getestet" bezeichnen.
Funktioniert wunderbar! :D
Ein dickes Danke.

Gruß
Adrian

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: [gelöst] Batch ausführen

Beitrag von alfware17 »

Ich habe Dein Problem verstanden und werde meinen Aufruf vielleicht auch noch auf asynchron umstellen. Hast du aber gelöst (wenn ja wie?), daß das aufrufende Programm mindestens solange wach bleibt, bis das aufgerufene Programm fertig ist?

Und vielleicht hast du ja noch mehr programmiert? Was ist mit dem Output des aufgerufenen Programms? Ich habe hier dazu gerade einen Thread erstellt, den die Profis sicher auch gleich in den Einsteigerbereich verschieben gedanklich, vielleicht hätte ich ihn auch hier erstelllen sollen

viewtopic.php?f=10&t=14412

Antworten