ProgramRunning liefert immer 1 zurück....

Für allgemeine Fragen zur Programmierung mit PureBasic.
Torakas
Beiträge: 63
Registriert: 13.09.2004 09:56

ProgramRunning liefert immer 1 zurück....

Beitrag 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
Benutzeravatar
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:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Torakas
Beiträge: 63
Registriert: 13.09.2004 09:56

Beitrag 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
Benutzeravatar
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

Beitrag von ts-soft »

>> Muss ich generell ein CloseProgramm machen
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.
Bild
Torakas
Beiträge: 63
Registriert: 13.09.2004 09:56

Beitrag von Torakas »

Danke fuer die Info. Hab zwar kein Speicherleck festgestellt aber sicher ist sicher. Hab es jetzt eingebaut.

Gruß,
Alphaman
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

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

Beitrag von ChristianK »

Interessant! :allright:
Das gleiche Problem hatte ich auch schon.Danke für die Erklärung freak!

@Andre:Kannst du das mit in die Hilfe aufnehmen?
ChristianK for President
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Dito! :allright:
War mir auch nicht so ganz bewußt...

Markus
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Antworten