Von CreateProcess auslesen (z.b. wget)
Übersicht

![]() |
Wild-StormBetreff: Von CreateProcess auslesen (z.b. wget) |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Visit http://www.next-dimension.org
------------------------------------------------- Freeware Modelle, Texturen & Sounds: http://www.blitzforum.de/forum...hp?t=12875 |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group