Differenze tra le versioni di "Attendere e verificare la chiusura di un programma gestito da Process"

Da Gambas-it.org - Wikipedia.
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Possiamo considerare almeno cinque modalità di attesa e verifica della chiusura di un programma esterno aperto e gestito mediante "''Process''".
+
Possiamo considerare almeno cinque modalità di attesa e verifica della chiusura di un programma esterno aperto e gestito mediante la Classe ''Process''.
 
 
 
 
==Chiusura con ''Killall'' ed attesa con ''Wait''==
 
  
 +
==Chiusura e successiva verifica con "Process.State"==
 
  Private pr As Process
 
  Private pr As Process
 +
 
 
   
 
   
 +
Public Sub Form_Open()
 
   
 
   
  '''Public''' Sub Form_Open()
+
  <FONT color=gray>' ''Lancia come esempio l'editor di testi "Gedit":''</font>
 +
  pr = Exec ["gedit"]
 
   
 
   
  <FONT color=#006400>' ''Lanciamo come esempio l'editor di testi "Gedit":''</font>
+
  End
  pr = Exec ["gedit"]
 
 
   
 
   
'''End'''
 
 
   
 
   
 +
Public Sub Button1_Click()
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  pr.Kill
 +
 
 +
  <FONT color=gray>' ''Compie questo ciclo di attesa, sinché il processo non è ancora chiuso:''</font>
 +
  While pr.State = Process.Running
 +
    Print "Chiusura programma in corso"
 +
  Wend
 
   
 
   
  <FONT color=#006400>' ''Chiusura ed attesa della effettiva chiusura:''</font>
+
  <FONT color=gray>' ''Se il valore di "pr.State" è uguale a zero, allora il programma si è chiuso:''</font>
   Shell "killall gedit" Wait
+
   Print "Programma chiuso"
 
   
 
   
  '''End'''
+
  End
 
 
 
 
 
 
==Chiusura e successiva verifica con ''ps aux | grep...''==
 
  
 +
==Chiusura e successiva verifica con la sollevazione dell'Evento "_Kill()" della Classe ''Process''==
 
  Private pr As Process
 
  Private pr As Process
 
    
 
    
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
  <FONT color=#006400>' ''Lanciamo come esempio l'editor di testi "Gedit":''</font>
+
  <FONT color=gray>' ''Lancia come esempio l'editor di testi "Gedit":''</font>
  pr = Exec ["gedit"]
+
  pr = Exec ["gedit"] As "processo"
 +
 +
End
 +
 +
 +
<FONT color=gray>' ''Si solleverà un evento "_Kill()" alla chiusura del programma gestito da "Process":''</font>
 +
Public Sub processo_Kill()
 
   
 
   
'''End'''
+
  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 Button1_Click()
 
 
   
 
   
  Dim Risposta As String  
+
  Public Sub Form_Open()
 
    
 
    
   pr.kill
+
<FONT color=gray>' ''Lancia come esempio l'editor di testi "Gedit":''</font>
 +
   pr = Shell "gedit"
 
    
 
    
  Shell "ps aux | grep o.gambas" & " | grep -wv grep | wc -l" To Risposta  |[[#Note|1]]|
+
  Me.Center
 
   
 
   
  Print risposta
+
End
 
   
 
   
<FONT color=#006400>' ''Se il valore contenuto nella variabile "risposta" è uguale a zero,''
 
' ''allora il programma si è chiuso.''</font>
 
 
   
 
   
  '''End'''
+
  Public Sub Button1_Click()
 
 
 
 
 
 
==Chiusura e successiva verifica con ''Process.State''==
 
 
 
Private pr As Process
 
 
 
 
   
 
   
'''Public''' Sub Form_Open()
+
  Dim cartella, comm As String
 
   
 
   
<FONT color=#006400>' ''Lanciamo come esempio l'editor di testi "Gedit":''</font>
+
  For Each cartella In Dir("/proc")
  pr = Exec ["gedit"]
+
    If Exist("/proc" &/ cartella &/ "comm") Then
 +
      comm = File.Load("/proc" &/ cartella &/ "comm")
 +
      If comm Like "gedit*" Then pid = cartella
 +
    Endif
 +
  Next
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button2_Click()
 
   
 
   
 
   pr.Kill
 
   pr.Kill
 
 
<FONT color=#006400>' ''Verifica della chiusura del programma:''</font>
 
  While pr.State = 1
 
    Print "Chiusura programma in corso"
 
  Wend
 
 
 
<FONT color=#006400>' ''Se il valore di "pr.State" è uguale a zero,''
 
' allora il programma si è chiuso:''</font>
 
  Print "Programma chiuso"
 
 
   
 
   
  '''End'''
+
  <FONT color=gray>' ''Si attende la chiusura del processo:''</font>
 +
  Repeat
 +
    Wait 0.01
 +
  Until Not Exist("/proc" &/ pid)
 +
<FONT color=gray>' ''Questa ultima riga, ovviamente, può essere scritta anche così:''
 +
' '''Until Exist("/proc" &/ pid) == False'''</font>
 +
 +
  Print "Il processo si è chiuso"
 +
 +
End
  
 
+
==Chiusura con ''Killall'' ed attesa con ''Wait''==
 
 
==Chiusura e successiva verifica con la sollevazione di un evento "Process.Kill"==
 
  
 
  Private pr As Process
 
  Private pr As Process
 
 
 
   
 
   
'''Public''' Sub Form_Open()
 
 
   
 
   
  <FONT color=#006400>' ''Lanciamo come esempio l'editor di testi "Gedit":''</font>
+
Public Sub Form_Open()
   pr = Exec ["gedit"] As "processo"
+
 +
  <FONT color=gray>' ''Lancia come esempio l'editor di testi "Gedit":''</font>
 +
   pr = Exec ["gedit"]
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  <FONT color=#006400>' ''Si solleverà un evento "_Kill()" alla chiusura del programma gestito da "Process":''</font>
+
  Public Sub Button1_Click()
'''Public''' Sub processo_Kill()
 
 
   
 
   
  Print "Il processo è stato chiuso !"
+
<FONT color=gray>' ''Chiusura ed attesa della effettiva chiusura:''</font>
 +
  Shell "killall gedit" Wait
 
   
 
   
  '''End'''
+
  End
  
 +
==Chiusura e successiva verifica con ''ps aux | grep...''==
  
 
==Chiusura e verifica dell'esistenza della cartella del processo in "/proc/"==
 
 
  Private pr As Process
 
  Private pr As Process
Private pid As String
 
 
 
'''Public''' Sub Form_Open()
 
 
 
  pr = Shell "gedit"
 
 
    
 
    
  Me.Center
 
 
   
 
   
  '''End'''
+
  Public Sub Form_Open()
 
   
 
   
 +
<FONT color=gray>' ''Lancia come esempio l'editor di testi "Gedit":''</font>
 +
  pr = Exec ["gedit"]
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  End
 
   
 
   
  Dim cartella, comm As String
 
 
    
 
    
 +
Public Sub Button1_Click()
 
   
 
   
  For Each cartella In Dir("/proc")
+
  Dim Risposta As String  
   
+
 
    If Exist("/proc/" & cartella & "/comm") Then
+
  pr.kill
      comm = File.Load("/proc/" & cartella & "/comm")
+
 
+
  Shell "ps aux | grep o.gambas" & " | grep -wv grep | wc -l" To Risposta <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
        If comm Like "gedit*" Then pid = cartella
 
       
 
    Endif
 
   
 
  Next
 
   
 
'''End'''
 
 
 
'''Public''' Sub Button2_Click()
 
 
  pr.Kill
 
 
<FONT color=#006400>' ''Si attende la chiusura del processo:''</font>
 
  Do
 
    Wait 0.01
 
  Loop Until Not Exist("/proc/" & pid)
 
<FONT color=#006400>' ''Questa riga, ovviamente, può essere scritta anche così:''
 
  '''Loop Until Exist("/proc/" & pid) = False'''</font>
 
 
 
   
 
   
    Print "Il processo si è chiuso"
+
  Print risposta <FONT color=gray>' ''Se il valore della variabile "risposta" è uguale a zero, allora il programma si è chiuso.''</font>
 
   
 
   
  '''End'''
+
  End
  
  
  
----
+
=Note=
==Note:==
 
 
[1] Questa soluzione è stata suggerita dall'Amministratore ''Leo72'' del Forum del sito Gambas-it.org.
 
[1] Questa soluzione è stata suggerita dall'Amministratore ''Leo72'' del Forum del sito Gambas-it.org.

Versione attuale delle 16:38, 11 lug 2023

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.