Attendere e verificare la chiusura di un programma gestito da Process

Da Gambas-it.org - Wikipedia.

Possiamo considerare almeno cinque modalità di attesa e verifica della chiusura di un programma esterno aperto e gestito mediante la Classe Process.

Chiusura e successiva verifica con "Process.State"

Private pr As Process
 

Public Sub Form_Open()

' Lancia come esempio l'editor di testi "Gedit":
 pr = Exec ["gedit"]

End


Public Sub Button1_Click()

 pr.Kill
 
' Compie questo ciclo di attesa, sinché il processo non è ancora chiuso:
 While pr.State = Process.Running
    Print "Chiusura programma in corso"
 Wend

' Se il valore di "pr.State" è uguale a zero, allora il programma si è chiuso:
 Print "Programma chiuso"

End

Chiusura e successiva verifica con la sollevazione dell'Evento "_Kill()" della Classe Process

Private pr As Process
 

Public Sub Form_Open()

' Lancia come esempio l'editor di testi "Gedit":
 pr = Exec ["gedit"] As "processo"

End


' Si solleverà un evento "_Kill()" alla chiusura del programma gestito da "Process":
Public Sub processo_Kill()

 Print "Il processo è stato chiuso !"

End

Chiusura e verifica dell'esistenza della cartella del processo in "/proc/"

Private pr As Process
Private pid As String


Public Sub Form_Open()
 
' Lancia come esempio l'editor di testi "Gedit":
 pr = Shell "gedit"
 
 Me.Center

End


Public Sub Button1_Click()

 Dim cartella, comm As String

 For Each cartella In Dir("/proc")
   If Exist("/proc" &/ cartella &/ "comm") Then
     comm = File.Load("/proc" &/ cartella &/ "comm")
     If comm Like "gedit*" Then pid = cartella
   Endif
 Next

End


Public Sub Button2_Click()

 pr.Kill

' Si attende la chiusura del processo:
 Repeat
   Wait 0.01
 Until Not Exist("/proc" &/ pid)
' Questa ultima riga, ovviamente, può essere scritta anche così:
' Until Exist("/proc" &/ pid) == False

 Print "Il processo si è chiuso"

End

Chiusura con Killall ed attesa con Wait

Private pr As Process


Public Sub Form_Open()

' Lancia come esempio l'editor di testi "Gedit":
  pr = Exec ["gedit"]

End


Public Sub Button1_Click()

' Chiusura ed attesa della effettiva chiusura:
 Shell "killall gedit" Wait

End

Chiusura e successiva verifica con ps aux | grep...

Private pr As Process
 

Public Sub Form_Open()

' Lancia come esempio l'editor di testi "Gedit":
  pr = Exec ["gedit"]

End

 
Public Sub Button1_Click()

 Dim Risposta As String  
 
 pr.kill
 
 Shell "ps aux | grep o.gambas" & " | grep -wv grep | wc -l" To Risposta  [nota 1]

 Print risposta ' Se il valore della variabile "risposta" è uguale a zero, allora il programma si è chiuso.

End


Note

[1] Questa soluzione è stata suggerita dall'Amministratore Leo72 del Forum del sito Gambas-it.org.