Seite 1 von 1
ProgramRunning liefert immer 1 zurück....
Verfasst: 23.06.2007 16:34
von Torakas
Hi Leute,
ich habe das Problem das die Funktion ProgramRunning immer nur den Wert 1 zurückliefert auch wenn das Programm bereits beendet ist.
Ich habe zum Beispiel mit:
ProgrammCode.l = RunProgram("test.exe", "", "", #PB_Program_Open|#PB_Program_Read)
Delay(10000)
debug ProgramRunning(ProgrammCode.l)
den Versuch gemacht. Nach den 10 Sek. ist das Programm bereits beendet aber die Funktion ProgramRunning liefert immer noch 1 zurück.
Was mache ich falsch?
Gruß,
Torakas
Verfasst: 23.06.2007 19:53
von Falko
In der Hilfe zu PB unter RunProgram() steht folgendes:
PB-hilfe hat geschrieben:Ein mittels #PB_Program_Open ausgeführtes Programm muss mit CloseProgram() geschlossen werden. Die 'Read', 'Write', 'Error' und 'Connect' Flags benötigen auch ein gleichzeitig gesetztes #PB_Program_Open Flag.
Ich sehe in deinem Source aber kein CloseProgram(), bzw. ein KillProgram(),
wie es in der Hilfe steht.
Zum Überprüfen würde ich das anders machen. Lässt sich aber bestimmt noch optimieren.
Da ich ein geschlossenes und beendetes Programm
nicht mit 'Ergebnis = ProgramRunning(Programm)' überprüfen kann,
weil mir der Debugger dann einen Fehler anzeigt, habe ich es
etwas anders gelöst.
Code: Alles auswählen
ProgrammCode.l = RunProgram("Notepad.exe", "", "", #PB_Program_Open|#PB_Program_Read)
Anfang:
If IsProgram(ProgrammCode) = 0
MessageRequester("Programminfo","Programm wurde beendet")
End
Else
MessageRequester("Programminfo","Programm wird jetzt beendet")
KillProgram(ProgrammCode)
CloseProgram(ProgrammCode)
Goto Anfang
EndIf
Hierbei wird die IF/Endif-Schleife zweimal durchlaufen. Einmal, wenn das Programm geladen ist und Programinfo > 0 ist und dann nochmal, wenn
die Bedingung auf IsProgram(ProgrammCode) = 0 zutrifft.
Gruß Falko
Verfasst: 25.06.2007 14:09
von Torakas
Das Problem ist dass das Programm automatisch beendet wird und ich die Information haben wollte ob das Programm schon beeendet ist bevor ich die Daten von dem Programm auslese.
Jetzt mache ich es so das ich prüfe ob Daten von dem Programm gesendet wurde. Dann weiss ich auch dass das Programm von mir beendet ist.
Muss ich generell ein CloseProgramm machen auch wenn das Programm von selbst beendet wurde?
Gruß,
Torakas
Verfasst: 25.06.2007 14:31
von ts-soft
>> Muss ich generell ein CloseProgramm machen
Wenn Du #PB_Program_Open verwendet hast, grundsätzlich!!!
Ansonsten gibts ein Speicherleck
Verfasst: 25.06.2007 16:13
von Torakas
Danke fuer die Info. Hab zwar kein Speicherleck festgestellt aber sicher ist sicher. Hab es jetzt eingebaut.
Gruß,
Alphaman
Verfasst: 25.06.2007 20:16
von freak
ProgramRunning() gibt auch wahr zurück wenn das Programm bereits beendet wurde,
aber noch daten zum lesen in der pipe bereitstehen.
Es ist zur Verwendung zusammen mit ReadProgramString() etc. gedacht.
WaitProgram() mit einem 0 timeout kann verwendet werden um zu testen
wann das Program beendet wurde, ohne die pipes zu beachten.
Es ist aber nicht zu empfehlen mit dem Lesen von Daten in der pipe zu warten bis
das Programm beendet wurde, denn wenn der Puffer der pipe voll ist, so wartet
das schreibende Program bis etwas gelesen wurde und wird dann natürlich auch
nicht beendet. Man sollte also immer auch Daten lesen, wenn das #PB_Program_Read
Flag werdendet wird um eine solche Deadlock-Situation zu vermeiden.
Verfasst: 26.06.2007 08:44
von ChristianK
Interessant!
Das gleiche Problem hatte ich auch schon.Danke für die Erklärung freak!
@Andre:Kannst du das mit in die Hilfe aufnehmen?
Verfasst: 26.06.2007 09:42
von Kurzer
Dito!
War mir auch nicht so ganz bewußt...
Markus