CreateProcess()

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

#Reaper

Newsposter

Betreff: CreateProcess()

BeitragMi, März 14, 2007 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

hab Probleme mit CreateProcess(). Und zwar weiß ich einfach nicht, wie ich es richtig verwende. In B+ konnte man den Process ja einfach mit den normalen Stream-Funktionen auslesen, aber in BMax geht das ja nun nicht so. Nach langem hin und her probieren und freeprocess.bmx anschauen kam ich zu folgendem:

Code: [AUSKLAPPEN]

process:TProcess = CreateProcess("tracert blitzforum.de")

handle:TPipeStream = process.pipe


DebugLog handle.ReadAvail()
DebugLog handle.ReadLine()
While handle.ReadAvail()
   DebugLog handle.ReadLine()
Wend


Aber das funktioniert nicht wirklich, .ReadLine() und gibt nichts zurück, .ReadAvail() gibt nur 120 zurück, wenn ich ein Delay zwischen dem CreateProcess() und ReadAvail() einbaue, ansonsten 0.
Ich weiß leider nicht weiter, hab auch nichts im Web gefunden Sad
Wisst ihr was?

#Reaper Wink
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

simi

BeitragMi, März 14, 2007 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
      Local s:String = blopp
      Local proc:TProcess = TProcess.Create(s,1)
      
      If proc = Null Then
         Notify "Couldn't start "+s
         Return
      End If

      s = ""
      While proc.Status()<>Null
         While proc.pipe.readavail()
            s :+ Chr(proc.pipe.Readbyte())
         Wend
      Wend
      proc.terminate
      
      Notify2("Loader",s)


ein ausschnitt aus meinem aktuellen Projekt...... ich denke sollte eigentlich selbsterklärend sein.... Die 2. While-Schleife ist dazu da, das auch wirklich alle Bytes gelesen werden.... : wenn das aufgerufene Programm mehrere Bytes aufs mal sendet, würde nur das erste gelesen, deshalb diese wiederholung....
 

klepto2

BeitragMi, März 14, 2007 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst einen ganz einfachen logischen Fehler.

Du lässt dein Programm nur solange laufen wie ReadAvail() <> 0, das funktioniert aber nicht, da es wahrscheinlich ist, das du bei der Schleife ankommst bevor dein prozess überhaupt etwas senden konnte. Somit ist ReadAvail() = 0 und deine Ausgabe Schleife wird niemals ausgeführt.

Hier mal eine korrektere Version:

Code: [AUSKLAPPEN]

process:TProcess = CreateProcess("tracert blitzforum.de")

handle:TPipeStream = process.pipe


DebugLog handle.ReadAvail()
DebugLog handle.ReadLine()
While process
   If handle.ReadAvail()
    Local Line:String = handle.ReadLine()
    If Line <> "" Then Print Line
   EndIf
Wend
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu
 

#Reaper

Newsposter

BeitragMi, März 14, 2007 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, ok, habs verstanden Very Happy

(Seltsam, in B+ ging das dann immer gleich mit dem Auslesen, aber naja, ist ja richtig so Wink )

Aber noch eine kleine Frage: Embarassed
@simi: Wo kommt jetzt bitte der Befehl Readbyte() her? Den gibts im FreeProcess-Module doch garnicht.. oder? Confused
(Btw: Ist Notify2() ein Befehl von dir, oder fehlt der mir? ^^)

Danke euch beiden Smile
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7
 

klepto2

BeitragDo, März 15, 2007 0:16
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Also Notify2 ist denk ich mal ein Befehl von ihm.
2. TPipeStream ist von TStream erweitert worden also hat TPipeStream alle Methoden von TStream (auch ReadByte).
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu
 

#Reaper

Newsposter

BeitragDo, März 15, 2007 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, cool, danke! Very Happy
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Mathias-Kwiatkowski

BeitragFr, März 16, 2007 12:41
Antworten mit Zitat
Benutzer-Profile anzeigen
CreateProgress funktioniert bei mir auch nicht egal wie man es anwenden würde! das ist das einzigste was ich an bmax auszusetzen habe!

und noch eines wenn man mit system_ oder createprogress ein weiteres programm aufruft, bricht er das weitere programm ab sobald das hauptprogramm geschlossen ist, des sollte eigentlich nicht sinn der sache sein!

ich stell mir mal vor ich mach ein AutoUpdater für ein game. dazu brauch ich bekanntlich 2 Programme

1.Das Game.EXE
2.Der Updater.EXE

damit ich game.exe Updaten kann muss das aber geschlossen sein. ist es geschlossen so läuft ja der updater nicht mehr... das ist eine zwickmühle!

man muss also dann den updater starten manuell! und das ist blödt

ich werde eine DLL in PureBasic Coden das den Befehl ExecFile ersetzen wird, also das man das hauptprogramm einfach beenden kann und das das 2. programm trotzdem noch läuft!

oder geht es doch anders in BMAX?

Mathias-Kwiatkowski

BeitragFr, März 16, 2007 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
so habe nun mal den befehl execfile als DLL ^^

www.purechannel.ath.cx/ExecFile.rar ist eine 3KB grosse WINRAR file

nur wie bindet man dll in Blitzmax ein? in BlitzBasic ging das ja noch einfach ^^ da brauchte man eine DECLS wie gehts in bmax?

so könnte man dann execfile anwenden ExecFile(pfad$+name$)

FOODy

BeitragFr, März 16, 2007 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
@DLL in BlitzMax:
Ganz einfach:
Code: [AUSKLAPPEN]
SuperStrict
Framework PUB.Win32

Local dll_handle:Int = LoadLibraryA("ExecFile.dll")
If Not dll_handle Throw "DLL konnte nicht initialisiert werden."

Global ExecFile(file$z) = GetProcAddress(dll_handle,"ExecFile")

ExecFile("notepad")
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB

Mathias-Kwiatkowski

BeitragFr, März 16, 2007 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
ok danke nun kann dann wieder jeder ExecFile nutzen Wink und im genuss kommen einen updater zu Programmieren! dann könnt ihr euch die DLL nun downloaden! HAVE FUN with it Smile Exclamation Very Happy
 

#Reaper

Newsposter

BeitragFr, März 16, 2007 15:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ihr könnt euch einfach die .bmx des pub.FreeProcess-Modules öffnen, ganz unten einfach das OnEnd auskommentieren, dann (sollte) es eigentlich gehen Smile
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

FOODy

BeitragFr, März 16, 2007 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder noch einfacher:
Einfach den Process-Eintrag in der globalen liste Löschen Wink

Code: [AUSKLAPPEN]
Framework PUB.FreeProcess

Local process:TProcess=CreateProcess("notepad")
TProcess.ProcessList.Remove process

End
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

#Reaper

Newsposter

BeitragFr, März 16, 2007 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch eine gute Möglichkeit Very Happy

Man könnte halt auch noch über einen Zusatzparameter einsellen, dass der Process nicht beendet werden soll.
Wofür ist eigentlich die Parameter "Flags"?
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

FOODy

BeitragFr, März 16, 2007 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
@Flags:
Im moment gibst nur einen (?) Flag: HIDECONSOLE.
Damit ist die Konsole von Konsolenanwendungen unsichtbar.


Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

#Reaper

Newsposter

BeitragFr, März 16, 2007 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, ok, danke! Smile
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

BtbN

BeitragFr, März 16, 2007 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
#Reaper hat Folgendes geschrieben:
Man könnte halt auch noch über einen Zusatzparameter einsellen, dass der Process nicht beendet werden soll.


Nein, ist leider nicht so einfach.
Wenn ein Prozess einen Child-Prozess öffnet, werden beim beenden des parents alle Childs automatisch mit gekillt, ohne dass sie etwas tun können.
Auf Linux kenne ich da z.B. nohup, was dagegen etwas tun könnte, auf win kenne ich da nix.

Lunatix

BeitragFr, März 16, 2007 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ausser man entfernt diese aus der Prozess Liste...
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

BtbN

BeitragFr, März 16, 2007 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Dies würde bedeuten, dass FreeProcess den Prozess automatisch detached.
Wäre auch ne gute möglichkeit.
 

#Reaper

Newsposter

BeitragFr, März 16, 2007 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
BORNtobeNAMELESS hat Folgendes geschrieben:
#Reaper hat Folgendes geschrieben:
Man könnte halt auch noch über einen Zusatzparameter einsellen, dass der Process nicht beendet werden soll.


Nein, ist leider nicht so einfach.
Wenn ein Prozess einen Child-Prozess öffnet, werden beim beenden des parents alle Childs automatisch mit gekillt, ohne dass sie etwas tun können.
Auf Linux kenne ich da z.B. nohup, was dagegen etwas tun könnte, auf win kenne ich da nix.



Sry, so meinte ich das nicht, mein Fehler. Embarassed
Ich meinte das Selbe wie FOODy, eine extra Variable dazucoden, welche dann eben dem Code "sagt", dass er beim beenden den Process nicht beendet. Wink

PS:
Da es ein so ein "Public" Module ist, kann man da irgendwie direkt mitwirken und sowas als Verbesserung vorschlagen oder so..?
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7
 

Dreamora

BeitragSa, März 17, 2007 3:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst Sachen hinzufügen, vielleicht werden sie übernommen, vielleicht auch nicht.
Aber PUB heisst eigentlich nur das BRL da Fremdcode verwendet hat und nicht alles von ihnen kommt. Nicht mehr. (steht nicht für public im sinne von alle können drin rumwüten)

Usermodule sind weder in PUB noch in BRL erwünscht weil die zwei ModServer automatisch inkludiert werden wenn man nicht Framework benutzt.

PS: es gibt bereits eine modifikation für CreateProzess hier im Module Board, die es erlaubt Prozesse über den Programmtod hinaus bestehen zu lassen. Die Suchfunktion hilft.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group