Von CreateProcess auslesen (z.b. wget)

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Wild-Storm

Betreff: Von CreateProcess auslesen (z.b. wget)

BeitragSa, Jun 30, 2007 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Thread wurde eigentlich wegen eines anderen Problemes erstellt aber jetzt habe ich nochmal eines mit CreateProcess & co, sodass ich einfach dieses Thema dafür benutze.
Also ich starte ein Konsolenprogramm (um genauer zu sein: wget) und will nun z.B. auslesen, wie schnell das Programm runterlädt (normalerweise sieht man das ja z.b. in der Konsole. Nunja, das geht halt aber irgendwie nicht..also sowas wie "wget --help" lässt sich super auslesen...
Hier mal der Code:
code]process:TProcess = CreateProcess("/usr/bin/wget http://www.next-dimension.org/....rar")
handle:TPipeStream = process.pipe

while not (handle.ReadAvail() = 0 and process.status() = 0)
if handle.ReadAvail()
local Line:byte = handle.readbyte()
if line then print line
endif
wend [/code]

Nunja...print gibt nichts aus..man muss zwar warten, bis wget fertig runtergeladen hat, aber ansonsten sieht man nicht wirklich was..Was muss ich tun, um zu sehen, was mir wget ausgibt?





alt//
Zitat:
Hi,
ich bin alle Themen die dieses Modul betreffen bereits durchgegangen, habe alle Codes ausprobiert aber bekomme einfach nichts raus, wenn ich process.pipe.readline/readbyte benutze.

z.B.

Code: [AUSKLAPPEN]
process:TProcess = CreateProcess("wget --help")

handle:TPipeStream = process.pipe


Print handle.ReadAvail()
Print handle.ReadLine()
While process.Status() <> Null
   If handle.ReadAvail()
    Local Line:String = handle.ReadLine()
    If Line <> "" Then Print Line
   EndIf
Wend


ReadAvail gibt 0 zurück, Readline bleibt leer. Delay oder Spielchen der Art bringen auch nichts..
Mache ich irgendwie was falsch oder gibt es Dinge, die ich beachten muss, wenn ich das ganze auf Linux teste?

mfg


edit:// Ahhh..anscheinend muss ich den kompletten Pfad angeben..also "usr/bin/wget"

Das nächste Problem aber wäre, dass "While process.Status() <> Null" sich sofort beendet, weil process.status irgendwie immer 0 zurückgibt..ganz egal ob das Programm noch läuft oder schon "tot" ist. Mit Readavail will ich nicht wirklich arbeiten, da es dort ja immer wieder Komplitkationen geben soll, wenn das gestartete Programm zu "langsam" läuft

edit2:// Woah ich bin heut morgen wohl irgendwie aufn Kopf gefallen..natürlich gibt das Programm null zurück, da es ja nur schnell den Hilfe-Stuff rausbringt...habs inzwischen selber gelöst Wink
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875

Blitzcoder

Newsposter

BeitragSa, Jun 30, 2007 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
process:TProcess = CreateProcess("/usr/bin/wget http://www.next-dimension.org/....rar")
handle:TPipeStream = process.pipe

while not (handle.ReadAvail() = 0 and process.status() = 0)
if handle.ReadAvail()
local Line:byte = handle.readbyte()
if line then print line
endif
wend


Das kann so ja nicht gehen. Du testest, ob Bytes zu lesen sind (Readavail). Aber so viel spuckt wget natürlich nicht aus.

Probiers mal so (ungetestet):
Code: [AUSKLAPPEN]
process:TProcess = CreateProcess("/usr/bin/wget http://www.next-dimension.org/....rar")
pipe1:TPipeStream = process.pipe
pipe2:TPipeStream = process.errpipe

while process.status()
    if pipe1.ReadAvail()
        local Line:String =pipe1.readline()
        if line then print line
    endif
    if pipe2.ReadAvail()
        local Line:String = pipe2.readline()
        if line then print line
    endif
wend


Hier ist ein Beispiel, von dem ich weiß, dass es geht (Ich muss hier mal bmx installieren):
Code: [AUSKLAPPEN]
Function Exec(path:String,hide:Int=0)

   Local proc:TProcess = CreateProcess(path,hide)

   If proc Then

      Local buf:Int = MilliSecs()

      While proc.status()

         

         Delay 2

         If (MilliSecs() - buf) > 10 Then

            PollEvent()

            If EventID() = EVENT_WINDOWCLOSE Then End

            buf=MilliSecs()

         EndIf



         If proc.pipe.readavail()

            print proc.pipe.readline()

         EndIf

         If proc.err.readavail()

            print proc.err.readline()',proc.err)

         EndIf



      Wend

   Else

      print "Kann "+path+" nicht ausführen"

   EndIf

End Function
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

Wild-Storm

BeitragSa, Jun 30, 2007 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay also wie ich grad sehe..es liegt an der Pipe.
Process.Pipe gibt in dem Fall nichts aus, im Gegensatz zu Process.Err (verstehe ich nicht so ganz oO)
Naja aber das nächste Problem ist, dass er den Process jetzt zwar ausliest aber nach kurzer Zeit einen MAV zurückgibt
Je mehr ich jetzt aber bei deiner Funktion an Delay angebe, desto länger dauert es, bis der MAV auftritt. Leider gibt es keine Detailangaben..es kommt einfach nur: MAV

edit:// beim 1. Code von dir passiert das auch, nur dass der MAV dort sofort eintritt, wenn die Zeile mit der Geschwindigkeit ausgelesen wird.

edit2:// Zur Veranschaulichung:

Code: [AUSKLAPPEN]
 1950K .......... .......... .......... .......... .......... 21%  469.21 KB/s
 2000K .......... .......... .......... .......... .......... 22%  321.20 KB/s
 2050K .......... .......... .......... .......... .......... 22%  437.76 KB/s
~>Unhandled Exception:appstub.linux signal handler 11


edit:// So, gelöst: BC hat mich darauf hingewiesen, dass man die Pipe mit process.err.Readstring ( process.err.readavail ) auslesen soll..klappt super, kein MAV
Danke nochmal an dich ^^


mfg
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group