Abarbeitungsreihenfolge

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
didi
Beiträge: 46
Registriert: Mo 10. Mai 2010, 20:43
OS, Lazarus, FPC: Linux / Windows
CPU-Target: AMD 64-Bit
Wohnort: Plauen im Vogtland
Kontaktdaten:

Abarbeitungsreihenfolge

Beitrag von didi »

Moin, als Anfänger habe ich folgenden Algorithmus in Lazarus unter Pardus-Linux programmiert und habe dazu eine Frage.

Algorithmus:
- Skript als Textdatei erstellen
- Textdatei (Skript) mit chmod auf "ausführbar" setzen
- Skript arbeiten - Skript erstellt Report-Textdatei
- Report-Textdatei zur Auswertung wieder einlesen

Das Setzen auf "ausführbar" und die Abarbeitung des Skriptes mache ich mit "AProcess.Execute", d.h ich starte den konsole-Befehl.
Meine Frage ist nun:
Erst wenn ich zwischen "Skript abarbeiten" und "Report-Textdatei zur Auswertung wieder einlesen" eine Sleep-Anweisung einfüge klappt die Sache.
Ohne die Sleep-Anweisung ist es so, das sich das Programm "übeholt" d.h. er findet die erstellte Report-Textdatei nicht.
Mit "poWaitOnExit" und "poUsePipes" habe ich dabei auch experimentiert, jedoch ohne Erfolg.
Ist das mit "Sleep" OK oder gibt es noch eine genialere Lösung?
Danke für Eure Antworten im Voraus. :D

Gruß didi ><>

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Abarbeitungsreihenfolge

Beitrag von Socke »

Sleep ist nicht unbedingt der richtige Weg, weil du nicht wirklich davon ausgehen kannst, das Sleep genau das macht was du willst - oder besser gesagt - während Sleep genau das passiert, was passieren soll.

Die beste Lösung wäre wohl, wenn das Script den Report auf StdOut ausgibt anstatt in eine Datei zu schreiben (oder einfach selbst einliest und wieder ausgibt).

Übrigens: kann man unter *nix nicht die Dateirechte direkt beim erstellen angeben?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
didi
Beiträge: 46
Registriert: Mo 10. Mai 2010, 20:43
OS, Lazarus, FPC: Linux / Windows
CPU-Target: AMD 64-Bit
Wohnort: Plauen im Vogtland
Kontaktdaten:

Re: Abarbeitungsreihenfolge

Beitrag von didi »

Danke für die Antwort!
*nix
- damit kann ich absolut nichts anfangen, könntest Du das bitte kurz erläutern?
Damit Du siehst was das kleine Programm leisten soll habe ich mal ein BS-Foto angehängt. Da wird auch klar wo die Ausgaben landen müssen.

Gruß didi ><>
Dateianhänge
SysFea_Laz.jpeg

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Abarbeitungsreihenfolge

Beitrag von shokwave »

Hallo,

ich denke mal du sucht das: TProcess.WaitOnExit

Und mit *nix meint Socke UNIX-ähnliche Betriebssysteme wie Linux, BSD, MacOS X...
mfg Ingo

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: Abarbeitungsreihenfolge

Beitrag von hendy »

kann man nicht in einer variable speichern, diese in eine Textdatei schreiben und diese dann als report verwenden?
Dankt monta !!

Benutzeravatar
didi
Beiträge: 46
Registriert: Mo 10. Mai 2010, 20:43
OS, Lazarus, FPC: Linux / Windows
CPU-Target: AMD 64-Bit
Wohnort: Plauen im Vogtland
Kontaktdaten:

Re: Abarbeitungsreihenfolge

Beitrag von didi »

@shokwave:
ich denke mal du sucht das: TProcess.WaitOnExit
Das hört sich schon mal gut an. Habe mal mit "Repeat Until AProcess.WaitOnExit=True;" probiert - hat aber auch nicht geklappt.
Nun habe ich noch gelesen, dass es die Eigenschaft "ISRunning" gibt, aber wie wird die abgefragt? :?:

@hendy:
kann man nicht in einer variable speichern, diese in eine Textdatei schreiben und diese dann als report verwenden?
Damit kann ich leider nichts anfangen.

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Abarbeitungsreihenfolge

Beitrag von shokwave »

Hm, also ein Beispiel könnte so aussehen:

Code: Alles auswählen

process1.CommandLine:='./mysleep';  //kleines Programm, dass einfach 20s wartet
  process1.Options:=process1.Options+[poWaitOnExit];
  process1.ShowWindow:=swoHIDE;
  process1.Execute;
  if process1.WaitOnExit then
    showMessage('fertsch')
  else
    showMessage('Fehler');
Die Meldung "fertsch" kommt wie erwartet nach 20 Sekunden. Ein Problem könnte das Script sein. Im Wiki steht
Anmerkung: TProcess ist kein Terminal bzw. keine Shell! Weder können Scripte direkt ausgeführt werden, noch kann die Ausgabe mit Operatoren wie "|", ">", "<", "&" etc. umgeleitet werden. Es ist möglich die gleichen Ergebnisse mit TProcess und FreePascal zu erziehen. Ein paar Beispiele finden Sie weiter unten.
Was nicht unbedingt heißt, dass es gar nicht geht, aber eben vielleicht nicht jede Funktion wie gewünscht funktioniert.

Mit "Running" kannst du es auch probieren.

Code: Alles auswählen

...
process1.execute
while process1.Running do
  Application.Idle(False);
end;
showMessage('fertsch');
...
Bei mir klappt beides.
mfg Ingo

Benutzeravatar
didi
Beiträge: 46
Registriert: Mo 10. Mai 2010, 20:43
OS, Lazarus, FPC: Linux / Windows
CPU-Target: AMD 64-Bit
Wohnort: Plauen im Vogtland
Kontaktdaten:

Re: Abarbeitungsreihenfolge

Beitrag von didi »

Moin shokwave,

danke für Deine sehr ausführliche Antwort. Ich habe beide Varianten probiert - sie ließen sich auch ordnungsgemäß abarbeiten aber das Ergebnis war mit meiner ursprünglichen Version immer noch stabiler.
Nach längerem Nachdenken glaube ich auch, dass das Problem einfach tiefer, im Skript selbst, sitzt. Im Skript selbst wird ja die Report-Textdatei erzeugt, also weitere kind-Prozesse aufgerufen und deren Abschluß
müßte geprüft werden. Ich sehe das auch in Dolphin wenn ich das Programm abarbeite wie die Dateien und in welchen Zeiten sie entstehen. Auch die Berechnung der MD5-Summe einer ISO-Datei braucht ja ihre Zeit.
Es war für mich auch sehr interessant die Anwendung und Auswertung der Option poWaitOnExit zu sehen! Das Programm wird für mich weiter ein Testfeld bleiben. :D
Noch eine Bemerkung: Ich bin in Stadroda zur Schule gegangen und in Rudolstadt hatten wir mal ein Klassentreffen. Da hat es mir so gut gefallen (Heidecksburg), dass wir dann mal einen kleinen Urlaub dort gemacht haben - ist in guter Erinnerung!

Gruß didi ><>

Antworten