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 "Process".


Chiusura con Killall ed attesa con Wait

Private pr As Process


Public Sub Form_Open()

' Lanciamo 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()

' Lanciamo 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  |1|

  Print risposta

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

End


Chiusura e successiva verifica con Process.State

Private pr As Process
 

Public Sub Form_Open()

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

End


Public Sub Button1_Click()

 pr.Kill
 
' Verifica della chiusura del programma:
 While pr.State = 1
    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 di un evento "Process.Kill"

Private pr As Process
 

Public Sub Form_Open()

' Lanciamo 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()
 
 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:
  Do
    Wait 0.01
  Loop Until Not Exist("/proc/" & pid)
' Questa riga, ovviamente, può essere scritta anche così:
  Loop Until Exist("/proc/" & pid) = False


   Print "Il processo si è chiuso"

End



Note:

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