Differenze tra le versioni di "Chiudere programmi esterni"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
Per terminare un programma esterno aperto è possibile usare '''Kill''' o '''Killall''' (a seconda delle situazioni).
+
Per terminare un programma esterno aperto è possibile usare:
 
+
* '''Kill''' o '''Killall''' (a seconda delle situazioni). Va distinto però il ''Kill'', quale <SPAN style="text-decoration:underline">metodo</span> di ''Process'', dal ''Kill'', quale comando da utilizzare con ''Shell'' (o '' Exec'');
Va distinto però il ''Kill'', quale <SPAN style="text-decoration:underline">metodo</span> di ''Process'', dal ''Kill'', quale comando da utilizzare con ''Shell'' (o '' Exec'').
+
* chiudendo la sua finestra.
  
  
Riga 115: Riga 115:
 
    
 
    
 
  '''End'''
 
  '''End'''
 
 
Facciamo un esempio pratico utilizzando anche il comando bash: ''xprop'':
 
'''Private''' i As Integer
 
 
 
'''Public''' Sub Form_Open() 
 
 
 
Dim pr As Process 
 
Dim ss, x As New String[] 
 
Dim s, y As String 
 
 
 
  pr = Shell "xprop | grep '(WINDOW):'" For Read 
 
 
 
 
 
  While Not Eof(pr) 
 
    Input #pr, s 
 
    ss.Add(s) 
 
  Wend 
 
 
 
 
 
<FONT color=#006400>' ''Dividiamo la stringa contenente il primo valore esadecimale,''
 
' ''in modo tale da ottenere la seconda parte utile, priva di “0x”:''</font>
 
    x = Split(ss[4], "x")
 
<FONT color=#006400>' ''Dividiamo la stringa contenente il secondo valore esadecimale,''
 
' ''in modo tale da ottenere le ultime due cifre più a destra:''</font>
 
    y = Right(ss[9], 2) 
 
<FONT color=#006400>' ''Individua il valore esadecimale preciso della finestra, lo trasforma in decimale:''</font>
 
    i = Val("&" & x[1]) - Val("&" & y) 
 
 
 
'''End'''
 
 
 
 
 
'''Public''' Sub Button1_Click() 
 
 
 
Dim dw As DesktopWindow 
 
 
 
 
 
  dw = New DesktopWindow(i) 
 
 
 
<FONT color=#006400>' ''Effettua lo spostamento della finestra:''</font>
 
    dw.<FONT color=#B22222>Close(10, 10)</font>
 
 
 
'''End'''
 
Il puntatore del mouse muterà a forma di crocetta. Si dovrà cliccare una volta sulla finestra interessata. Quindi cliccando successivamente sul Button1, la finestra prescelta del programma si chiude.
 
 
  
  

Versione delle 10:00, 6 gen 2013

Per terminare un programma esterno aperto è possibile usare:

  • Kill o Killall (a seconda delle situazioni). Va distinto però il Kill, quale metodo di Process, dal Kill, quale comando da utilizzare con Shell (o Exec);
  • chiudendo la sua finestra.


Caso in cui un programma esterno sia stato aperto dalla nostra applicazione.gambas, sia gestito mediante "process", e si intenda chiuderlo con il metodo ".Kill" di Process

Private hp As Process


Public Sub Form_Open()

' Avviamo un programma esterno e lo gestiamo come processo:
   hp = Exec["nome_programma_esterno"]

End


Public Sub Button1_Click()

' Chiudiamo il programma esterno mediante il metodo di Process: Kill:
   hp.Kill

End

Per questo caso vedi anche la nota |1| .


Caso in cui un programma esterno non sia stato aperto dalla nostra applicazione.gambas, e non sia gestito mediante "process"

In questo caso potremo utilizzare due soluzioni.

1) Possiamo chiudere il programma esterno con il comando Killall, lanciato con Shell (o Exec), al quale passiamo il nome del programma:

Public Sub Button1_Click()

   Shell "Killall nome_programma_esterno"

End


2) Possiamo chiudere il programma esterno con il comando Kill, lanciato con Shell (o Exec), al quale passiamo il numero del PID del programma. |2|

Public Sub Button1_Click()

   Shell "Kill numero_PID_del_programma_esterno"

End

L'utilità di quest'ultima modalità può vedersi nel caso in cui si hanno più programmi .gambas aperti e si intende chiuderne uno solo. Poiché il nome del processo (visibile nel file /proc/numero_pid/comm) è identico a tutti i programmi .gambas (ossia: gbr3), se si adottasse il comando precedente killall gbr3, si chiuderebbero tutti i programmi .gambas aperti. Se, invece, si usasse quel comando inserendo il nome del programma, ossia così: killall nome_programma, si otterrebbe questo errore: nome_programma: nessun processo trovato, in quanto il comando bash killall vuole il nome del processo del programma, e non quello del programma visibile nel file esecutivo. Allora, potremo inserire il nome del programma, ed individuare il suo PID; quindi chiudere il programma con il comando kill:

Public Sub Button1_Click()

 Dim s1, s2, pid As String
   
  s1 = InputBox("Inserire il nome del programma (senza l'estensione .gambas):")
   
  For Each pid In Dir("/proc")
   
    If Exist("/proc/" & pid & "/cmdline") Then
      s2 = File.Load("/proc/" & pid & "/cmdline")

      If s2 Like "*" & s1 & ".gambas*" Then
        Shell "kill " & pid
        Exit
      Endif
   
    Endif
   
  Next
 
End


Caso in cui il programma esterno sia stato aperto dalla nostra applicazione.gambas, e si intenda chiuderlo con il comando Kill

Possiamo avere due sotto-casi.

1) Se il programma è gestito tramite Process, possiamo passare al comando Kill il numero del PID ottenuto mediante il metodo " .Id" di "Process" nel modo spiegato in questa pagina.

2) Se il programma non è gestito mediante Process, allora si dovrà scegliere un altro algoritmo per individuare e raccogliere il numero del PID del prgramma esterno da chiudere.

Quello che è da sottolineare, è che in entrambi i suddetti sotto-casi il numero del PID di un programma aperto dalla nostra applicazione.gambas mediante Shell (o Exec), affinché l'esecuzione del comando "Kill" abbia buon fine, deve essere passato a Kill incrementato di un'unità:

 Public Sub Button1_Click()
 
  Dim pidIncrementato As Integer

   pidIncrementato = numero_PID_del_programma_esterno + 1

   Shell "Kill pidIncrementato"

End


Caso in cui il programma esterno viene chiuso con istruzione diversa dai comandi Kill e Killall

Possiamo chiudere il programma esterno anche attraverso la chiusura espressa della sua finestra |4|. In questo caso, però, non utilizzeremo i comandi Kill e Killall, bensì con la classe DesktopWindow. In tal caso si dovrà attivare nel progetto anche il componente gb.desktop:

Public Sub Button1_Click()

 Dim ss As String[]
 Dim dw As DesktopWindow


' Viene individuato l'Handle del programma che ha generato la propria finestra:
  ss = Desktop.FindWindow("nome_programma o nome_della_finestra_del_programma")

' Viene individuata la finestra in base al suo handle,
' e viene quindi inserita in una variabile di tipo "DesktopWindow":
  dw = Desktop.Windows.FromHandle(ss[0])

' Viene infine chiusa la finestra del programma, e pertanto il programma medesimo:
  dw.Close()
 
End


Note

[1] Vedere al riguardo anche questa pagina.

[2] Come cercare ed estrarre il PID di un programma, è stato già trattato in questa pagina specifica. |3|

[3] Potremmo utilizzare, per trovare e passare il PID di un programma aperto e non gestito mediante "Process", anche questo algoritmo:

Public Sub Button1_Click()

Dim riga As String
Dim plus As String[]

 Shell "pgrep -f nome_programma_da_chiudere" To riga

 plus = Split(riga, "\n")

' Passa a Kill il primo elemento dell'array stringa,
' il quale, essendo parte della stringa generata dal comando "pgrep",
' contiene sempre il numero del PID del programma:
   Shell "kill " & plus[0]

End

oppure quest'altro che, però, procederà in modo un po' più... brutale alla chiusura del programma:

Public Sub Button1_Click()

Dim riga As String
Dim plus As String[]
Dim b As Integer

 Shell "ps -aux | grep " & "nome_programma_da_chiudere" To riga

 plus = Split(riga, " ")

 For b = 0 To plus.Max
' Passa a Kill - "forzatamente" - ed in modo distinto ogni elemento dell'array stringa.
' Quando Kill riceverà l'elemento contenente la stringa con il numero del PID del programma, questo si chiuderà:
   Try Shell "kill " & plus[b]
 Next

End

[4] Vedere anche questa pagina.