CreateProcess()
Übersicht

#ReaperNewsposterBetreff: CreateProcess() |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Wisst ihr was? #Reaper ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah, ok, habs verstanden ![]() (Seltsam, in B+ ging das dann immer gleich mit dem Auslesen, aber naja, ist ja richtig so ![]() Aber noch eine kleine Frage: ![]() @simi: Wo kommt jetzt bitte der Befehl Readbyte() her? Den gibts im FreeProcess-Module doch garnicht.. oder? ![]() (Btw: Ist Notify2() ein Befehl von dir, oder fehlt der mir? ^^) Danke euch beiden ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah, cool, danke! ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ok danke nun kann dann wieder jeder ExecFile nutzen ![]() ![]() ![]() ![]() |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ihr könnt euch einfach die .bmx des pub.FreeProcess-Modules öffnen, ganz unten einfach das OnEnd auskommentieren, dann (sollte) es eigentlich gehen ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oder noch einfacher:
Einfach den Process-Eintrag in der globalen liste Löschen ![]() 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 |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Auch eine gute Möglichkeit ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah, ok, danke! ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
#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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dies würde bedeuten, dass FreeProcess den Prozess automatisch detached.
Wäre auch ne gute möglichkeit. |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() Ich meinte das Selbe wie FOODy, eine extra Variable dazucoden, welche dann eben dem Code "sagt", dass er beim beenden den Process nicht beendet. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group