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
ProgramRunning liefert immer 1 zurück....
- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
In der Hilfe zu PB unter RunProgram() steht folgendes:
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.
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
Ich sehe in deinem Source aber kein CloseProgram(), bzw. ein KillProgram(),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.
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
die Bedingung auf IsProgram(ProgrammCode) = 0 zutrifft.
Gruß Falko
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
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
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
>> Muss ich generell ein CloseProgramm machen
Wenn Du #PB_Program_Open verwendet hast, grundsätzlich!!!
Ansonsten gibts ein Speicherleck
Wenn Du #PB_Program_Open verwendet hast, grundsätzlich!!!
Ansonsten gibts ein Speicherleck
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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.
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.
- ChristianK
- Beiträge: 77
- Registriert: 13.12.2004 14:55