Gambas-it

Gambas3 => Programmazione => Topic aperto da: allegfede - 23 Dicembre 2016, 13:33:02

Titolo: [DOPPIO RISOLTO] Intercettare la chiusura di una applicazione
Inserito da: allegfede - 23 Dicembre 2016, 13:33:02
Qualche tempo fa' i gentili amici gambassiani mi hanno dato una mano ad intercettare la richiesta di ciusura di una applicazione (attraverso il widget X) per fare una serie di cose prima di chiudere (o rigettare proprio la chiusura).

Un po come quando si chiude Libreoffice senza aver salvato ...

Ora vorrei intercettare la richiesta di chiusura dell'applicazione gambas da parte el sistema operativo (o da parte dell'utente quando preme il pulsante STOP nell'ide di gambas).

E' possibile fare una cosa similare?

l'evento DEACTIVATE non si puo' usare, perche' viene lanciato anche semplicemente la finestra dell'app viene nascosta da altre finestre del desktop manager.
l'evento CLOSE non me lo lancia proprio ..... stranamente ....

Non so cosa inventarmi per terminare i processi figli che il mio applicativo lancia dopo il suo avvio.
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 23 Dicembre 2016, 15:13:23
Non sono sicuro che possa esserti utile, ma ti potresti scaricare dalla Software farm l'ultima versione di WatchGambasDirectory.

 :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 23 Dicembre 2016, 17:08:21
Ora vorrei intercettare la richiesta di chiusura dell'applicazione gambas da parte ..... dell'utente quando preme il pulsante STOP nell'ide di gambas.

l'evento DEACTIVATE non si puo' usare, perche' viene lanciato anche semplicemente la finestra dell'app viene nascosta da altre finestre del desktop manager.
Suppongo da queste due righe che, quando l'utente preme il tasto rosso dello "Stop" nell'IDE, tu voglia che l'applicazione che si sta appunto per chiudere intercetti l'evento della sua morte.    :death:

Dunque, l'Evento _Deactivate( ) sarebbe l'optimum, ma se la finestra dell'applicazione è stata abbassata, detto Evento nell'attimo della chiusura dell'applicazione non funziona.

V'è da sotolineare, qualora ve ne fosse necessità, che l'applicazione.... una volta passata a "miglior vita".... non può essere più autocosciente.
Allo stato attuale, posso dire che solo un'altra applicazione Gambas, esterna, può intercettare, registrare la chiusura, la morte dell'applicazione principale in questione.   
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: allegfede - 23 Dicembre 2016, 19:37:28
in realta' il DEACTIVATE me lo lancia anche quando metto una finestra sopra quella dell'applicazione gambas ....
per vederlo ho messo debug "deacitvate lanciato" nell'evento Form_Deactivate ....

strano eh?

si un supervisor come appunto "supervisor" (un utile app linux) potrebbe essere interessante.

Pero' pensavo che forse potrei "rovesciare" il punto di vista:
Al RIAVVIO della mia applicazione Gambas, potrei scansionare i processi (sospettamente) figli di una precedente istanza  e chiuderli (una specie di garbage collector) prima di andare a regime ....
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 23 Dicembre 2016, 21:55:51
in realta' il DEACTIVATE me lo lancia anche quando metto una finestra sopra quella dell'applicazione gambas ....
Ma certamente non quando la finestra dell'applicazione è stata nascosta, abbassata.



si un supervisor come appunto "supervisor" (un utile app linux) potrebbe essere interessante.
Basta un'applicazioncina Gambas che periodicamente va a vedere se il processo dell'applicazione monitorata è ancora eistente.



potrei scansionare i processi (sospettamente) figli di una precedente istanza 
Scusa, ma 'sti fiji de na...... come vengono lanciati ?
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: allegfede - 24 Dicembre 2016, 16:52:29
Codice: [Seleziona]
' Gambas class file

Private Player As Process

......

Public Sub PlayFile(Path As String)
  Player = Shell "mpv \x22" & Path & "\x22 --no-osc --input-unix-socket=/tmp/mpvsocket" For Output As "Osserva"
End

 .....

Public Sub Osserva_Read()
  If Player.EndOfFile = True Then
    Debug "fine" & Time
    Else
      Player.ReadLine
  Endif
End
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 24 Dicembre 2016, 17:29:24
E una cosa così?:
Codice: [Seleziona]
' Gambas class file'

'' La proprietà Stacking su Above.
Private $bAttivo As Boolean

Public Sub Form_Deactivate()
 
  If $bAttivo = False Then Print "Hanno cliccato sull'ide allora faccio qualcosa"
 
End

Public Sub Attiva()
  ' Viene attivato dalle altre form dell'applicazione''
  $bAttivo = True
 
End

 :ciao: :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 24 Dicembre 2016, 18:02:44
E una cosa così?:
...
 

Scusa era un'idea farlocca, sembra non possa funzionare  :nono:
A meno che tutte le altre finestre non siano di tipo dialog  ;D

 :ciao: :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 25 Dicembre 2016, 01:33:04
sembra non possa funzionare
Ripeto che l'uso dell'evento _Deactivate( ) non può andare bene, poiché non viene sollevato qualora la finestra interessata dell'applicazione sia stata abbassata.


Ora vorrei intercettare la richiesta di chiusura dell'applicazione gambas...

Non so cosa inventarmi per terminare i processi figli che il mio applicativo lancia dopo il suo avvio.
...ma tu quale delle due cose vuoi ?
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 25 Dicembre 2016, 12:22:01

Ripeto che l'uso dell'evento _Deactivate( ) non può andare bene, poiché non viene sollevato qualora la finestra interessata dell'applicazione sia stata abbassata.


Se la finestra principale ha la proprietà Stacking su Above come fa a finire "abbassata"  :-\
Se sulle finestre secondarie metti un osservatore su Deactivate che lanci Attiva() funziona bene (era nella mia idea originale poi dimenticata al momento ella prova).

Fra poco vado a mettere le gambe sotto il tavolo e per un po...

Ancora Buon Natale a tutti  :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 25 Dicembre 2016, 15:15:23
Se la finestra principale ha la proprietà Stacking su Above
Forse non sono in grado di esprimermi tecnicamente in modo preciso.

Per "abbassata" non intendo "tenere la finestra dell'applicazione al di sopra delle finestre di ogni altro programma".
Io, invece, intendo "ridurre ad icona", "minimizzare" la finestra principale.

Dunque, se la finestra dell'applicazione Gambas viene ridotta ad icona, se viene minimizzata, l'evento _Deactivate non funziona.
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 26 Dicembre 2016, 11:04:34
Non mi ero accorto che avevi cambiato il post, si ora ho capito è vero non si può usare l'evento deactivate.
Penso occorra rivolgersi al componente gb.desktop.
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: kicco - 26 Dicembre 2016, 11:39:18
...e lavorare direttamente nella routine  Form_close? :-\
 :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 26 Dicembre 2016, 14:02:54
...e lavorare direttamente nella routine  Form_close? :-\
 :ciao:

Non funziona, come del resto aveva già constatato allegfede, ti basta fare una semplice prova crei un progetto grafico e nella routine _Close inserisci un print o un debug che scriva qualcosa e poi chiudi il progetto dall'IDE.

 :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 26 Dicembre 2016, 14:52:58
Penso occorra rivolgersi al componente gb.desktop.
Qualunque diavoleria si voglia utilizzare .....magari una bella Macchina del Tempo (http://forum.ubuntu-it.org/images/smilies/love.gif) ...bisognerà comunque avere un secondo programma che constati la chiusura del'applicazione principale.
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: kicco - 26 Dicembre 2016, 16:32:10
Citazione
Non funziona, come del resto aveva già constatato allegfede, ti basta fare una semplice prova crei un progetto grafico
se nella routine -Clouse richiamo una routine che mi stampa in una textarea e poi metto un wait, la form aspetta a chiudersi e scrive prima nella textarea.
Devo quindi tenere attiva la subroutine fintanto che non ho finito gli altri job.
Lo so così è logica, e qul che serve è la ciccia (codice).
Ci sto pensando. :P
Citazione
.bisognerà comunque avere un secondo programma che constati la chiusura del'applicazione principale.
io ho capito che l'ultima cosa che deve accadere è la chiusura del main, e che questa deve attendere la chiusura di altri form...
Se non capisco male tu proponi un ulteriore codice che controlla la chiusura del principale.
DOMANDA: Il form che chiude tutto ed esce dal programma è per forza quello relativo alla classe d'inizio?
 :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: kicco - 26 Dicembre 2016, 16:52:18
Mettendo nel form un pulsante e una TextArea:
Codice: [Seleziona]
' Gambas class file

Private bol As Boolean = False

Public Sub Form_close()
    TextArea1.text = "QQQQ"
    Repeat
        If bol = False Then
      Wait 0.1
    Endif
      Until bol = True
End

Public Sub Button1_Click()
    bol = True
  End
Così chiudo l'applicazione, ma finchè non premo il pulsante, non si chiude...
È una stupidata? :P
 :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 26 Dicembre 2016, 17:37:56
Scusa Kicco, ma sei sicuro di aver inquadrato il problema?
Qui si sta parlando di ottenere comunicazione della chiusura di un programma dal pulsante rosso quadrato sito nella toolbar della IDE di Gambas.
Mi sa che hai frainteso il pulsante  ;D

 :ciao: :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: kicco - 26 Dicembre 2016, 17:46:43
Citazione
ma sei sicuro di aver inquadrato il problema?
no, non sono sicuro! :P
Quando chiudi il form con il pulsantino rosso, con il mio codice puoi effettuare prima dell'effettiva chiusura una serie di operazione che credo fosse quello che chiedeva Allegfede!
Lui faceva l'esempio del di libreoffice, se chiudi prima dì aver salvato, lui ti avvisa e ti permette il salvataggio.
Sbaglio?
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 26 Dicembre 2016, 17:55:40
Mi sa che hai frainteso il pulsante 
kicco, effettivmente non è che hai premuto quello sbagliato ?    :-X

(http://i.imgur.com/80kOjAn.gif)
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: kicco - 26 Dicembre 2016, 18:01:13
 :D
Fammi capire qual è il pulsante, se non è quello rosso del form, è quello di chiusura del menù principale?
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 26 Dicembre 2016, 18:03:31
Quello visibile nell'immagine sotto allegata.

Ovviamente il tasto è visibile solo quando il codice del progetto è in funzione.   
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: kicco - 26 Dicembre 2016, 18:10:45
 :)
Allora non ho capito niente!!! :D
Ma perchè ha fatto l'esempio di un programma compilato (libreoffice) come esempio per parlare di uno in esecuzione con l'interprete?
Tu mi risponderai Chiedilo a lui!
Allegfede perchè? :D
 :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 26 Dicembre 2016, 21:22:09
Tu mi risponderai Chiedilo a lui!
Allegfede perchè?
C'è anche un'altra domanda:
lui vuole intercettare la richiesta di chiusura dell'applicazione gambas, oppure vuole terminare i processi figli che l'applicativo lancia dopo il suo avvio ?   (http://i.imgur.com/Blm5oDc.gif)

Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: allegfede - 12 Gennaio 2017, 17:59:44
con il mio solito ritardo, vi spiego la situazione:

il programma in gambas e' player video che utilizza MPV da shell per fare la riproduzione di piu' filmati in una sequenza prefissata.
Pero' alle volte devo fare delle modifiche, delle correzioni al codice di gestione che "spara" i comandi ad mpv e devo chiudere il programma in gambas E il processo di MPV che e' diventato INDIPENDENTE.

Allora, siccome l'interfaccia NON ha il pulsante di chiusura (per evitare che l'utente finale possa accidentalmente terminare il "demone" (il mio gestore della playlist scritto in gambas), premo il pulsante STOP dell'IDE di gambas.

Vorrei che la mia applicazione capisse che il sistema operativo gli indica (gentilmente?) di terminare la sua esistenza e quindi termini tutti i processi da lui generati, per poter poi ripartire ex novo senza avere due, tre video che vengono riprodotti in contemporanea.

Per ora ho fatto il contrario, ovvero all'avvio dell'applicazione termino tutte le istanze di mpv e poi faccio ripartire il demone, ma logicamente l'effetto doveva enire prima della causa :D
Codice: [Seleziona]
Public Sub ClearSystem()
 
  WriteToSocket("stop")
 
End

......

Function WriteToSocket(comando As String) As String
Dim ritorno As String
 
  Select Case comando
    Case "add-logo"
      comando = "echo overlay-add 0 630 450 \x22/mnt/Qnap2OTVA/Tele_Galileo/LOGHI/StationLogoSD.data\x22 1 \x22bgra\x22 100 100 400 | socat - /tmp/mpvsocket"
    Case "remove-logo"
      comando = "echo overlay-remove 0  | socat - /tmp/mpvsocket"
    Case "stop"
      comando = "echo \x22stop\x22  | socat - /tmp/mpvsocket"
  End Select
 
  Shell comando To ritorno
 
  Debug ritorno
End


che pero' alle volte fallisce perche' i video in esecuzione possono essere diversi ..... more debug needed i suppose
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 12 Gennaio 2017, 19:30:36
Non so se ti può servire, in effetti non è esattamente quello che chiedi.
Faccio prima ad allegare un esempio.

 :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 13 Gennaio 2017, 00:16:25
Non so se ti può servire
Un'abile ed interessante proposta, ma allegfede, quando chiude il programma Gambas, dice che preme "il pulsante STOP dell'IDE di gambas."......


Si tratterebbe di intercettare la pressione del pulsante "STOP" dell'IDE di Gambas..... non so se mi spiego............... (https://www.foxestalk.co.uk/forums/uploads/emoticons/default_rolleyes.gif)
Poiché in tal caso l'interruzione non avviene agendo "dal" programma lanciato, resto del parere che la sua interruzione è "osservabile" soltanto attraverso un altro programma "spione", che svolga appunto la funzione di verificare l'esistenza in ogni momento del programma Gambas principale, ed eventualmente chiudere i programmi "figli", uccidendone i processi,  aperti dal quel programma Gambas principale quando era "in vita".
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 13 Gennaio 2017, 09:55:26
Non so se ti può servire
Un'abile ed interessante proposta, ma allegfede, quando chiude il programma Gambas, dice che preme "il pulsante STOP dell'IDE di gambas."......


Si tratterebbe di intercettare la pressione del pulsante "STOP" dell'IDE di Gambas..... non so se mi spiego............... (https://www.foxestalk.co.uk/forums/uploads/emoticons/default_rolleyes.gif)
Poiché in tal caso l'interruzione non avviene agendo "dal" programma lanciato, resto del parere che la sua interruzione è "osservabile" soltanto attraverso un altro programma "spione", che svolga appunto la funzione di verificare l'esistenza in ogni momento del programma Gambas principale, ed eventualmente chiudere i programmi "figli", uccidendone i processi,  aperti dal quel programma Gambas principale quando era "in vita".

Quanto tu dici è chiaro e appurato (anch'io avevo cercato di spiegarlo a Kicco), ma nell'ultimo post di Allegfede c'è scritto:


Allora, siccome l'interfaccia NON ha il pulsante di chiusura (per evitare che l'utente finale possa accidentalmente terminare il "demone" (il mio gestore della playlist scritto in gambas), premo il pulsante STOP dell'IDE di gambas.


e allora ho pensato che con quel trucco potrebbe variarne la dinamica (non c'è il pericolo di dare la combinazione accidentalmente) era solo un'idea in più.

 :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 13 Gennaio 2017, 10:05:44
Capisco bene; ed in effetti il vero problema - a mio avviso - è la chiusura (impropria) del programma usando il tasto Stop dall'IDE. Questa soluzione può avere senso nella mera fase di creazione del progetto (ma se lo volessi far usare ad altri utenti.... lui lo presenta utilizzabile aa livello di "progetto" ?); inoltre essa rende molto complessa la realizzazione di quanto qui allegfede ha chiesto.
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: allegfede - 16 Gennaio 2017, 17:44:04
interessante "workaround" GianLuigi, non ci avevo pensato :D

Ovvero fare nell'edito dei menu' una chiamata NASCOSTA che ha per shortcut CTRL+shift+q che lancia una procedura:
Codice: [Seleziona]
Public Sub btClose_Click()
 
  WriteToSocket("stop")
  Wait 0.2
 
  Me.Close
End

si il post effettivamente ha una doppia valenza, quella pratica a cui Gianluigi ha sopperito con un interessante suggerimento, e quella didattica a cui pensava Vuott.

che scrivo sul thread [(semi)RISOLTO] ? :D
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 16 Gennaio 2017, 21:01:10
Ma... scusa... allora la questione che dovevi porre non era " come intercettare la chiusura di un programma effettuata premendo il tasto Stop dell'IDE ", bensì " come chiudere un programma, affinché la chiusura possa essere intercettata dal programma medesimo prima di chiudersi ".   (http://forum.ubuntu-it.org/images/smilies/grrr.gif)
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 16 Gennaio 2017, 23:08:48

si il post effettivamente ha una doppia valenza, quella pratica a cui Gianluigi ha sopperito con un interessante suggerimento, e quella didattica a cui pensava Vuott.

che scrivo sul thread [(semi)RISOLTO] ? :D

Se ha una doppia valenza allora scrivi [Risolto due volte]  ;D   :P

Ma... scusa... allora la questione che dovevi porre non era " come intercettare la chiusura di un programma effettuata premendo il tasto Stop dell'IDE ", bensì " come chiudere un programma, affinché la chiusura possa essere intercettata dal programma medesimo prima di chiudersi ".   (http://forum.ubuntu-it.org/images/smilies/grrr.gif)

Ammesso e non concesso che la " pratica" risposta da me scritta possa essere risolutiva al suo problema, quello che mi ha fatto intuire e rispondere è stato:

Citazione
Allora, siccome l'interfaccia NON ha il pulsante di chiusura (per evitare che l'utente finale possa accidentalmente terminare il "demone" (il mio gestore della playlist scritto in gambas), premo il pulsante STOP dell'IDE di gambas.

Se avesse scritto come consigli tu, quel suggerimento probabilmente non l'avrei dato  :-\
Non è facile farsi comprendere perché non tutti interpretiamo le cose allo stesso modo, anzi direi che le interpretiamo quasi sempre in modi differenti   ;D
Forse la cosa migliore rimane quella di spiegare il perché si cerca una data cosa e come si è cercato di risolverla.

Non so se mi spiego, non è una critica ... una riflessione...

 :ciao: :ciao:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: vuott - 16 Gennaio 2017, 23:24:06
Non è facile farsi comprendere perché non tutti interpretiamo le cose allo stesso modo, anzi direi che le interpretiamo quasi sempre in modi differenti   ;D

Può non essere errata questa tua considerazione (http://forum.ubuntu-it.org/images/smilies/sisi.gif) , ma... allora che scriviamo a fare qua sopra ?    :rotfl:

Rischiamo ora di rotolare sul suolo della gnoseologia.   :-X
Insomma tutta roba che non ha niente a che vedere con sane Macchine del Tempo !   :hatecomputer:
Titolo: Re:Intercettare la chiusura di una applicazione
Inserito da: Gianluigi - 16 Gennaio 2017, 23:35:05
Rischiamo ora di rotolare sul suolo della gnoseologia.   :-X
Insomma tutta roba che non ha niente a che vedere con sane Macchine del Tempo !   :hatecomputer:

 :rotfl: :rotfl:
Mi asterrò da battutacce ispiratemi da assonanze alla da me fino a oggi sconosciuta gnoseologia mi limiterò a dire questo:

Vuott e Kicco grazie di esistere  :-*

 :ciao: buonanotte  :sleepy:

P.S. sia inteso che voglio bene anche agli altri (si anche ad Allegfede)  :P