Fragen zu TProcess

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 4908
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Fragen zu TProcess

Beitrag von Mathias »

Wen ich TProcess mit "ls" ausführe, wird schön in die Memo geschrieben.
Aber mache ich es mit avrdude, kommt nichts im Memo an.
Ausgeführt wird es aber, ansonsten würde die LED am USBasp nicht aufleuchten.

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var
  AProcess: TProcess;
begin
  AProcess := TProcess.Create(nil);

//  AProcess.CommandLine := 'avrdude -patmega328p -cusbasp -v';
  AProcess.CommandLine := 'ls';

  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;

  Memo1.Lines.LoadFromStream(AProcess.Output);

  AProcess.Free;
end;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

shokwave
Beiträge: 435
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win10 (L 1.6 FPC 3.0.0)
CPU-Target: i386,x64
Wohnort: Rudolstadt

Re: Fragen zu TProcess

Beitrag von shokwave »

Hi,

Code: Alles auswählen

AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
poWaitOnExit bedeutet, dass er bis zum beenden des Prozeses wartet und dann den Output erst holt.

Guck dir mal den Wikieintrag dazu an. https://wiki.lazarus.freepascal.org/Exe ... en_Outputs
mfg Ingo

Mathias
Beiträge: 4908
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fragen zu TProcess

Beitrag von Mathias »

Ich hatte mein Beispiel auch von diesem Wiki.
Das Beispiel von deinem Link habe ich jetzt probiert.
Auch dort will avrdude nicht.

Code: Alles auswählen

  AProcess.CommandLine := 'ls /home/tux/fpcupdeluxe_avr25 -R '; // geht
  AProcess.CommandLine := 'avrdude';  // geht nicht 
Dies ist mir ein Rätsel, wen ich ein AVR-Project mit Lazarus mache, dann kommt die Ausgabe von avrdude im Nachrichtenfenster. Siehe Anhang.
Dateianhänge
Bildschirmfoto vom 2020-06-12 16-16-17.png
Bildschirmfoto vom 2020-06-12 16-16-17.png (57.86 KiB) 594 mal betrachtet
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 4908
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fragen zu TProcess

Beitrag von Mathias »

Mir ist noch etwas aufgefallen.
Mache ich folgendes:

Code: Alles auswählen

$ mount >> test.txt
Dann wird alles in test.txt umgeleitet.
Bei

Code: Alles auswählen

$ avrdude >> test.txt
Ist die Ausgabe trotzdem auf dem Bildschirm.

Daher könnte man meinen avrdude verwendet nicht das Standard-Ausgabegerät.

Aber wieso erscheint es dann im Lazarus-Nachrichten Fenster ?
Oder auch bei der Arduino-IDE ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

sstvmaster
Beiträge: 342
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: Fragen zu TProcess

Beitrag von sstvmaster »

Laut diesem Beitrag https://forum.arduino.cc/index.php?topic=46083.0 schreibt avrdude nicht nach stdout sondern nach stderr.
Der Beitrag ist zwar schon alt und ich kann es nicht Testen, aber vielleicht hilfts.

Natürlich das auch noch nehmen: https://www.freepascal.org/docs-html/cu ... tderr.html
LG Maik

Mathias
Beiträge: 4908
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fragen zu TProcess

Beitrag von Mathias »

Danke, das wars. Schon komisch, das avrdude in Stderr und nicht in Output schreibt. :roll:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  AProcess: TProcess;
begin
  AProcess := TProcess.Create(nil);
  AProcess.CommandLine := 'avrdude -patmega328p -cusbasp -vvvvv';
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
  Memo1.Lines.LoadFromStream(AProcess.Stderr);
  AProcess.Free;
end; 
Jetzt muss ich es nur noch in die Variante mit AProcess.Running einbauen.

Kann man mit WriteLn auch irgendwie in Stderr schreiben ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

sstvmaster
Beiträge: 342
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: Fragen zu TProcess

Beitrag von sstvmaster »

Sollte so gehen:

Code: Alles auswählen

WriteLn(StdErr, 'An error has occurred');
Siehe https://forum.lazarus.freepascal.org/in ... pic=6189.0
LG Maik

sstvmaster
Beiträge: 342
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: Fragen zu TProcess

Beitrag von sstvmaster »

Ping
LG Maik

Mathias
Beiträge: 4908
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fragen zu TProcess

Beitrag von Mathias »

sstvmaster hat geschrieben:
Fr 12. Jun 2020, 17:49
Laut diesem Beitrag https://forum.arduino.cc/index.php?topic=46083.0 schreibt avrdude nicht nach stdout sondern nach stderr.
Der Beitrag ist zwar schon alt und ich kann es nicht Testen, aber vielleicht hilfts.

Natürlich das auch noch nehmen: https://www.freepascal.org/docs-html/cu ... tderr.html
So nun habe ich es mal probiert, avrdude mit StdErr einzulesen.
Avrdude rufe ich momentan so auf: "avrdude -cusbasp -pattiny2313"
Da wird mir folgendes ausgespuckt:

Code: Alles auswählen

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e910a (probably t2313)

avrdude done.  Thank you.
Direkt auf der Konsole folgendes:

Code: Alles auswählen

$ avrdude -cusbasp -pattiny2313

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e910a (probably t2313)

avrdude: safemode: Fuses OK (E:FF, H:9F, L:E4)

avrdude done.  Thank you.
So wie es aussieht, wird die Zeile mit Fuses von TProcess verschluckt. :roll:

Ich habe nochmal mit Output anstelle von Stderr probiert.
Da müsste eigentlich die Zeile mit Fuses kommen, kommt aber auch nicht.

Jemand einen Rat ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1445
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Fragen zu TProcess

Beitrag von Warf »

wahrscheinlich wird die zeile die "verschluckt" nicht auf stderr geschrieben.

Um sowas zu testen benutz doch mal bash:

Code: Alles auswählen

$> avrdude -cusbasp -pattiny2313 1> stdout.log 2> stderr.log
Andere möglichkeit kann sein, manche programme ändern ihr output verhalten je nach dem obs in ein terminal geht oder nicht

sstvmaster
Beiträge: 342
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: Fragen zu TProcess

Beitrag von sstvmaster »

Im Wiki gibt es auch noch ein Beispiel, vielleicht ist die Pipe voll und wartet? https://wiki.freepascal.org/Executing_E ... en_Outputs

Man kann auch stderr zu stdout umleiten (poStderrToOutPut): https://www.freepascal.org/docs-html/cu ... tions.html
LG Maik

Mathias
Beiträge: 4908
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Fragen zu TProcess

Beitrag von Mathias »

Man kann auch stderr zu stdout umleiten (poStderrToOutPut): https://www.freepascal.org/docs-html/cu ... tions.html
Danke, dies würde mal funktionieren.
Aber die Zeile mit Fuses kommt immer noch nicht.

Noch ein Problem:

Code: Alles auswählen

 AProcess.CommandLine := command;     
Hier kommt eine Warnung, dies sei deprecated.
Welche Funktion sollte man da alternativ nehmen ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

sstvmaster
Beiträge: 342
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: Fragen zu TProcess

Beitrag von sstvmaster »

Mathias hat geschrieben:
Do 9. Jul 2020, 22:58
Hier kommt eine Warnung, dies sei deprecated.
Welche Funktion sollte man da alternativ nehmen ?

Code: Alles auswählen

  AProcess.Executable := 'avrdude';
  AProcess.Parameters.Add('-cusbasp');
  AProcess.Parameters.Add('-pattiny2313');
Steht alles hier: https://www.freepascal.org/docs-html/cu ... ocess.html
LG Maik

Winni
Beiträge: 272
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Fragen zu TProcess

Beitrag von Winni »

Hi!

FF - Fiese Falle bei Process.Parameters.add:

Kein Leerzeichen innerhalb von add, sondern zu zweimal Parameters.add trennen.
Zumindest in Linux verweigert er sonst den Job!

Winni

Socke
Lazarusforum e. V.
Beiträge: 2750
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: Fragen zu TProcess

Beitrag von Socke »

Winni hat geschrieben:
Fr 10. Jul 2020, 00:26
Kein Leerzeichen innerhalb von add, sondern zu zweimal Parameters.add trennen.
Zumindest in Linux verweigert er sonst den Job!
Unter Linux werden die Aufrufparameter einzeln an den neuen Prozess übergeben; daher kannst du über Parameters.Add() alle Sonderzeichen nutzen, die dir deine Shell sonst um die Ohren haut.
Windows ist da soweit ich weiß ein wenig eigensinniger: Alle Parameter müssen zusammen als eine Befehlszeile übergeben werden und werden dann von der Windowsshell wieder auseinander genommen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten