TProcess funktioniert nicht [gelöst];

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
spielmops
Beiträge: 7
Registriert: Sa 28. Nov 2009, 19:07

TProcess funktioniert nicht [gelöst];

Beitrag von spielmops »

Hallo,

ich bin Einsteiger in Sachen Lazarus auf Linux (mal abgesehen von guten Pascal-Kenntnissen mit Turbo-Pascal auf dem alten CPC unter CPM). Nach 2 Tagen Suche weiß ich immer noch nicht, warum ein Kommandoaufruf nicht funktioniert und ob es vielleicht ein Bug in Lazarus ist. Meine entsprechende Zeile lautet wie folgt:

Code: Alles auswählen

AProcess.CommandLine := '/usr/bin/mediainfo --Inform=Video;%DisplayAspectRatio/String% ' + filename;
     ShowMessage (AProcess.CommandLine)
;

ShowMessage zeigt genau das, was ausgeführt werden sollte, enden tut es aber mit einem SIGSEGV. Wenn ich die Zeile in die bash eingebe, dann passiert genau das, was ich will. Anmerkung für Nachahmer: das Semikolon hinter dem Wort Video muss für die bash in Anführungszeichen gesetzt werden. Tue ich das auch in dieser Zeile, ändert sich nichts. Was mache ich falsch?

Hartmut
Zuletzt geändert von spielmops am Sa 28. Nov 2009, 23:19, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess funktioniert nicht

Beitrag von theo »

spielmops hat geschrieben:

Code: Alles auswählen

AProcess.CommandLine := '/usr/bin/mediainfo --Inform=Video;%DisplayAspectRatio/String% ' + filename;
     ShowMessage (AProcess.CommandLine)
;
Und was erwartest du jetzt mit diesen Infos für eine Antwort?
Der Code da schreibt ja nur mal was in einen String und gibt's wieder aus. Da wird's wohl kaum knallen.
Du musst schon mehr Code zeigen.

spielmops
Beiträge: 7
Registriert: Sa 28. Nov 2009, 19:07

Re: TProcess funktioniert nicht

Beitrag von spielmops »

Kannst Du haben: (ich wollte aber niemanden langweilen)

Code: Alles auswählen

filename := OpenDialog1.Filename;
     ShowMessage(filename);
     AProcess := TProcess.Create(nil);
     AProcess.CommandLine := '/usr/bin/mediainfo --Inform=Video;%DisplayAspectRatio/String% ' + filename;
     ShowMessage (AProcess.CommandLine);
     AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
     AProcess.Execute;
     AStringList.LoadFromStream(AProcess.Output);
Hartmut

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess funktioniert nicht

Beitrag von theo »

Funktionieren denn andere Kommandos mit diesem Code? z.B. mit AProcess.CommandLine := 'ppc386 -h';
Hast du die AStringList irgendwo created?

spielmops
Beiträge: 7
Registriert: Sa 28. Nov 2009, 19:07

Re: TProcess funktioniert nicht

Beitrag von spielmops »

Es funktioniert zum Beispiel

Code: Alles auswählen

AProcess.CommandLine := 'xterm -e htop';
Das führt aber letztlich auch zu einem SIGSEGV, wenn ich xterm beende. Bei htop ist das kein Problem, weil ich ja keinen Output erwarte, aber in meinem eigentlich Fall warte ich auf die Ausgabe ...
Hartmut

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: TProcess funktioniert nicht

Beitrag von Targion »

Was passiert, wenn du diese Zeile

Code: Alles auswählen

AStringList.LoadFromStream(AProcess.Output);
weg lässt?

spielmops
Beiträge: 7
Registriert: Sa 28. Nov 2009, 19:07

Re: TProcess funktioniert nicht

Beitrag von spielmops »

Du hast recht, das entsorgt den SIGSEGV-Fehler, aber wie kriege ich dann den Output vom externen Programm raus? Im Wiki ist es in allen Beispielen so beschrieben und da ich nichts anderes finde ...

Hartmut

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess funktioniert nicht

Beitrag von theo »

Was ist nun mit meiner Frage von oben:
Hast du die AStringList irgendwo created?

spielmops
Beiträge: 7
Registriert: Sa 28. Nov 2009, 19:07

Re: TProcess funktioniert nicht

Beitrag von spielmops »

So in der Art: AProcess := TProcess.Create(nil); ?
Nein, nur als var declariert.

Hartmut

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess funktioniert nicht

Beitrag von theo »

Daran hast du nun 2 Tage getüftelt?
Richtig kopieren hätte gereicht: (Siehe: AStringList := TStringList.Create;)
http://wiki.lazarus.freepascal.org/Exec ... s_Beispiel" onclick="window.open(this.href);return false;

spielmops
Beiträge: 7
Registriert: Sa 28. Nov 2009, 19:07

Re: TProcess funktioniert nicht

Beitrag von spielmops »

Du hattest recht: das war es. Allerdings habe ich daran nicht 2 Tage getüftelt, sondern nur 3 Stunden. Der Rest war Einlesen in die Materie. Wenn Du mir jetzt noch sagen kannst, wie ich den ersten String aus der StringList in einen String ziehen kann, wär ich Dir total dankbar, denn dann funktioniert der Programmkern heute noch.

Hartmut

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess funktioniert nicht

Beitrag von theo »

spielmops hat geschrieben:Du hattest recht: das war es. Allerdings habe ich daran nicht 2 Tage getüftelt, sondern nur 3 Stunden. Der Rest war Einlesen in die Materie. Wenn Du mir jetzt noch sagen kannst, wie ich den ersten String aus der StringList in einen String ziehen kann, wär ich Dir total dankbar, denn dann funktioniert der Programmkern heute noch.

Code: Alles auswählen

S:=AStringList[0];
http://www.freepascal.org/docs-html/rtl ... glist.html" onclick="window.open(this.href);return false;

spielmops
Beiträge: 7
Registriert: Sa 28. Nov 2009, 19:07

Re: TProcess funktioniert nicht

Beitrag von spielmops »

Danke! Ich hatte es fast, allerdings hatte ich nicht mehr im Hinterkopf, dass eine Liste bei 0 (Null) anfängt!! Aber langsam kommts wieder, die ; setze ich schon automatisch.

Hartmut

Antworten