Ciao a tutti, volevo sapere se fosse possibile intercettare un applicazione aperta ed, eventualmente chiuderla. Per esempio, il mio programma deve aprire brasero, ma prima di farlo vorrei capire se questo è gia aperto e, in caso affermativo, chiuderlo o, cmq, impedire di avviare un ulteriore istanza dello stesso.
Oltre a questo, vorrei capire se posso gestire le istanze aperte dal mio programmino attraverso il pid per avere il controllo su di essi senza ricorrere al comando: Shell "Killall nomeprogramma"
oppure
Grazie!
Questione num. 1:
... il mio programma deve aprire brasero, ma prima di farlo vorrei capire se questo è gia aperto....
Io suggerirei di verificare se il suo PID esiste.
Si potrebbe così cercarlo in /proc, ad esempio, con le sole risorse di Gambas come segue:
Public Sub Main()
Dim cartella, comm As String
Dim nome_processo_programma As String = "brasero"
' Di ogni cartella presente in "/proc" pone il percorso nella variabile "cartella":
For Each cartella In Dir("/proc", Null, gb.Directory)
' Se in ogni cartella dei PID nella directory "/proc" c'è un file di testo chiamato "comm",
' ne carica il contenuto nella variabile Stringa "comm"
If Exist("/proc/" & cartella & "/comm") Then
comm = File.Load("/proc/" & cartella & "/comm")
' Verifica se in "comm" v'è in tutto o in parte il "nome" del programma che cerchiamo:
If comm Like nome_processo_programma & "*" Then
Print "Il programma "; nome_processo_programma; " è già in funzione !"
Endif
Endif
Next
End
Vedi anche in generale:
http://www.gambas-it.org/wiki/index.php?title=Individuare_ed_estrarre_il_PID_di_un_programma
2^ questione:
vorrei capire se posso gestire le istanze aperte dal mio programmino attraverso il pid per avere il controllo su di essi senza ricorrere al comando:
Shell "Killall nomeprogramma"
oppure
Devi usare la Classe "Process":
Private hp As Process
Public Sub Form_Open()
' Avviamo un programma esterno e lo gestiamo come processo:
hp = Shell "brasero"
End
Public Sub Button1_Click()
' Chiudiamo il programma esterno mediante il metodo di Process ".Kill":
hp.Kill
hp.Close
End
Vedi anche in generale:
http://www.gambas-it.org/wiki/index.php?title=Chiudere_programmi_esterni
vorrei capire se posso gestire le istanze aperte dal mio programmino attraverso il pid per avere il controllo su di essi senza ricorrere al comando:
Shell "Killall nomeprogramma"
oppure
....potresti fare anche il complicato ;D usando la funzione esterna "kill()" di C:
Private Const SIGKILL As Integer = 9
Private hp As Process
Private Extern uccidilo(pid As Integer, sig As Integer) As Integer In "libc:6" Exec "kill"
Public Sub Form_Open()
' Avviamo un programma esterno e lo gestiamo come processo:
hp = Shell "brasero"
End
Public Sub Button1_Click()
' Chiudiamo il programma esterno mediante la funzione esterna di C:
uccidilo(hp.Handle + 1, SIGKILL)
hp.Close
End
Potresti, inoltre, chiudere un'applicazione grafica chiudendo la sua finestra mediante la funzione esterna XDestroyWindow() della libreria X11, alla quale bisognerà passare l'ID di quella finestra:
Library "libX11:6.3.0"
' Display *XOpenDisplay(display_name)
' Opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(display$ As String) As Pointer
' XDestroyWindow(display, w)
' Destroys the specified window as well as all of its subwindows.
Private Extern XDestroyWindow(displayP As Pointer, w As Integer)
' XCloseDisplay(display)
' Closes the connection to the X server for the display specified in the Display structure and destroys all windows.
Private Extern XCloseDisplay(displayP As Pointer)
Public Sub Main()
Dim disp As Pointer
' Connessione al server X ed impostazione di default:
disp = XOpenDisplay(Null)
' Distrugge la finestra del programma esterno individuata dal suo ID:
XDestroyWindow(disp, ID_della_finestra)
' Chiude la libreria:
XCloseDisplay(disp)
End