Autore Topic: Componente Gb.Settings, funzione Inherits e metodi nascosti  (Letto 1430 volte)

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Derivando una classe con inherits posso usare tutti i metodi della classe genitrice facendo riferimenti con SUPER
ma non riesco a fare funzionare la cosa con i metodi nascosti

Codice: [Seleziona]
inherits button
public sub _free()
  SUPER._free()
end

Come posso fare a creare un riferimento alla _free() della classe genitrice?

Dove sbaglio?


« Ultima modifica: 06 Marzo 2021, 11:41:31 da Akrobaticone »
"e il naufragar m'è dolce in questo mar"

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #1 il: 05 Marzo 2021, 11:17:59 »
...
Come posso fare a creare un riferimento alla _free() della classe genitrice?

Dove sbaglio?

Farei meglio a stare zitto, vista la mia scarsa conoscenza dell'argomento.
Ciò detto, e fatto presente che sono nell'impossibilità di fare delle prove stante l'errore nella compilazione che affligge Gambas al momento, potrebbe dipendere dal fatto che essendo _free  un metodo statico non lo si possa usare in modo dinamico.  :-\

Tieni conto che _free è particolarissimo e facile a creare problemi, entra in funzione appena prima della distruzione di una classe e se lo usi è facile che ti restituisca un errore.

Appena rientro in possesso della IDE faccio qualche prova.  :ciao:
« Ultima modifica: 05 Marzo 2021, 11:21:53 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.327
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #2 il: 05 Marzo 2021, 13:42:40 »
...
ma non riesco a fare funzionare la cosa con i metodi nascosti

Codice: [Seleziona]
inherits button
public sub _free()
  SUPER._free()
end

Come posso fare a creare un riferimento alla _free() della classe genitrice?

Siamo sicuri che il cosiddetto "Metodo nascosto" possa essere usato all'interno di una routine in quel modo, ossia come un qualunque altro Metodo ?  :-\
A me pare che nei fatti il Metodo nascosto, al di là di tale definizione, sia in fondo un Evento.   :-\

Riferimenti nella nostra wiki:
* https://www.gambas-it.org/wiki/index.php?title=Metodi_nascosti
* https://www.gambas-it.org/wiki/index.php?title=Metodi_New()_e_Free()_degli_oggetti
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #3 il: 05 Marzo 2021, 14:23:25 »
 :-X

nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #4 il: 05 Marzo 2021, 15:27:05 »
@Akrobaticone,

dovresti spiegare un po cosa vorresti ottenere, perché normalmente se uno ha bisogno di un button particolare crea un nuovo componente...

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.327
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #5 il: 05 Marzo 2021, 16:37:18 »
:-X
Ok, ho visto il tuo esempio.
Come non detto.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #6 il: 06 Marzo 2021, 08:30:46 »
tutto nasce da un problema con la classe settings del quale ho parlato in mailing list
il problema è evitare il salvataggio automatico alla chiusura del programma
mi è stato suggerito di mettere mano alla stessa classe inserendo una condizione nella  routine _free() che blocca il salvataggio
https://lists.gambas-basic.org/pipermail/user/2021-March/072368.html
all ora ho pensato di derivare una classe dalla Settings nella quale sovrascrivo la routine free comprendendo l'opzione di salvataggio
Il codice postato da Gianluigi funziona, il mio invece no
la soluzione sarebbe copiare la classe settings dai sorgenti e modificarla, ma al di là del caso particolare mi è venuta la curiosità di comprendere meglio il funzionamento di inherits
Il problema della corruzione del file .conf si verifica su raspberry a causa del journaling di ext4 e del ritardo con il quale vengono eseguite le scritture su SD
allego il progetto, ho fatto anche altri tentativi istanziando la classe in altro modo, ma senza successo
« Ultima modifica: 06 Marzo 2021, 11:06:26 da Akrobaticone »
"e il naufragar m'è dolce in questo mar"

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #7 il: 06 Marzo 2021, 10:08:35 »

Il problema si verifica su raspberry a causa del journaling di ext4 e del ritardo con il quale vengono eseguite le scritture su SD
allego il progetto, ...

 ??? hai allegato il mio esempio per vuott, se non ti spieghi meglio con il tuo esempio non sono in grado di aiutarti.
Ammesso e non concesso che una volta allegato il progetto tuo, poi io ne sia capace...

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline kicco

  • Senatore Gambero
  • ******
  • Post: 1.703
  • So dove andare, seguitemi, ci perderemo insieme!
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #8 il: 06 Marzo 2021, 11:26:32 »
tutto nasce da un problema con la classe settings del quale ho parlato in mailing list
il problema è evitare il salvataggio automatico alla chiusura del programma
Perdonami, ma non capisco, perchè parli di salvataggio automatico?
Se chiudo il programma senza salvare i dati nel file di configurazione, non si salvano automaticamente!
Per cui credo di non aver capito.
 :ciao:
Chi ha paura muore ogni giorno, chi non ha paura muore una volta sola. (Paolo Borsellino)

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #9 il: 06 Marzo 2021, 11:31:14 »

Il problema si verifica su raspberry a causa del journaling di ext4 e del ritardo con il quale vengono eseguite le scritture su SD
allego il progetto, ...

 ??? hai allegato il mio esempio per vuott, se non ti spieghi meglio con il tuo esempio non sono in grado di aiutarti.
Ammesso e non concesso che una volta allegato il progetto tuo, poi io ne sia capace...

 :ciao:



forse manca un pezzo che ho dato per scontato

Riepilogo meglio

Su raspberry a volte si verifica la corruzione del file .conf dove si salvano le configurazioni con settings
allora ho chiesto in mailing list e mi hanno confermato che alla chiusura dell'applicazione avviene in automatico il salvataggio della configurazione
Ipozizzando che il problema sia il ritardo con cui i file su ext4 con journaling e le scritture su sd e dal momento in cui alla chiusura dell'applicazione raspberry viene spento immediatamente anche in modi non "cristiani", ho tentato di creare una classe derivata da Settings  introducendo una variabile che blocca la scrittura del file .conf che avviene nella routine _free() della classe settings.
All'interno dell'applicazione ad ogni salvataggio che eseguo do immediatamente dopo il comando "sync" da shell per forzare la scrittura su disco che altrimenti viene posticipata.
Pensavo che derivando la classe con inherits e sovrascrivendo la funzione _free() la cosa potesse funzionare, ma così non avviene
Al contrario Gianluigi, nel tuo esempio funziona
quindi mi è venuta la curiosità di capire come funziona inherits in questi casi.
Il problema in se lo posso risolvere inserendo il codice originale di Setting con una piccola modifica evitando quindi di selezionare il componente gb.settings, ma voglio capirci di più
Spero questa volta di essere stato piu chiaro e di aver messo tutti i pezzi che prima mancavano

Per dovere di cronaca condivido la mia esperienza
Su ext4 con journaling se si cancella un file e immediatamente dopo si toglie tensione al successivo riavvio il suddetto file possiamo ritrovarcelo ancora vivo e vegeto anche se subito dopo la cancellazione non risulta più presente al sistema operativo
Ciò è piu evidente su raspberry poichè il disco è una SD e la scrittura è molto piu lenta che su un HD
Nel caso di settings a volte mi ritrovo un file .conf con dimensione 0
La mia applicazione deve superare anche questa prova e ci ho perso un po di tempo per capire quale fosse il problema


 
"e il naufragar m'è dolce in questo mar"

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #10 il: 06 Marzo 2021, 11:34:56 »
tutto nasce da un problema con la classe settings del quale ho parlato in mailing list
il problema è evitare il salvataggio automatico alla chiusura del programma
Perdonami, ma non capisco, perchè parli di salvataggio automatico?
Se chiudo il programma senza salvare i dati nel file di configurazione, non si salvano automaticamente!
Per cui credo di non aver capito.
 :ciao:

perchè nel caso di settings quando avviene la chiusura dell'applicazione si distrugge anche l'oggetto setting e nell'evento  _free() avviene il salvataggio del file .conf
Codice: [Seleziona]
Public Sub _free()

  Try Me.Save
  If Error Then Error "gb.settings: warning: unable to save settings: "; $sPath; ": "; Error.Where;; Error.Text

End


aggiungo che per molto tempo ho ignorato il comando Settings.save e le configurazioni si sono sempre salvate da sole.....
« Ultima modifica: 06 Marzo 2021, 11:40:18 da Akrobaticone »
"e il naufragar m'è dolce in questo mar"

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
« Risposta #11 il: 06 Marzo 2021, 11:46:42 »
Prova questo codice:
Codice: [Seleziona]
Private $aList As String[] = ["", "Pippo", "Pluto", "Paperino", "Topolino", "Minnie"]
Private $bDefault As Boolean

Public Sub Form_Open()

  Settings.Read(Me)
  ComboBox1.List = Settings["Combo/List", $aList]
  $aList.Add("Clarabella")
  $bDefault = True

End

Public Sub Form_Close()
 
  If Not $bDefault Then Settings["Combo/List"] = $aList
  Settings.Write(Me)
 
End

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Inherits e metodi nascosti
« Risposta #12 il: 06 Marzo 2021, 11:57:03 »

Mettiamola così, ora che ne so di più ne so meno di prima.
Nel senso che non avendo raspberry non sono in grado di trovare una soluzione.
Le uniche cose che ti potevo dire le ho già scritte, ma se in raspberry non hai la certezza di poter scrivere su un file, non hai neanche la possibilità di programmare  :-\

...
Su ext4 con journaling se si cancella un file e immediatamente dopo si toglie tensione al successivo riavvio il suddetto file possiamo ritrovarcelo ancora vivo e vegeto anche se subito dopo la cancellazione non risulta più presente al sistema operativo
...

Io credo che ci sia il modo di verificare che il file sia stato effettivamente eliminato prima di togliere la corrente...  :-\
« Ultima modifica: 06 Marzo 2021, 12:01:01 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline akrobaticone

  • Gran Maestro dei Gamberi
  • *****
  • Post: 983
    • Mostra profilo
Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
« Risposta #13 il: 06 Marzo 2021, 12:34:08 »
Credo che il fatto di aver messo troppa carne al fuoco abbia solo portato confusione

La questione principale è
derivando la classe settings con inherits mi aspetto che anche il metodo ( o evento )  _free() venga sovrascritto dal nuovo codice che metto nella classe derivata cosi come accade per altri metodi
sembra che così non funziona e il metodo (o evento) _free continua a funzionare così come scritto nella classe genitrice.

Il motivo per cui ho deciso di derivare la classe Settings è che voglio evitare che alla sua distruzione ( e conseguente chiamata della funzione _free() avvenga il salvataggio del file di configurazione generato da Settings, ma che tale salvataggio possa o meno avvenire abilitato da una nuova proprietà che definisco nella classe derivata da Settings

Tutto questo nasce dal fatto che Ext4 con journaling ritarda a volte la scrittura su disco delle modifiche e che un file cancellato dal sistema operativo ( e che non risulta piu presente ad esso) torni poi miracolosamente in vita se nell'istante che viene cancellato il sistema si blocca per una mancanza di tensione
Ciò è particolarmente piu evidente in raspberry poichè usa una sd e al ritardo di ext4 si aggiunge la lentezza di scrittura su disco
Ciò può compromettere anche il file .conf se immediatamente dopo la chiusura dell'applicazione (e conseguente salvataggio) si toglie immediatamente l'alimentazione ( e questo non posso evitarlo)

Aggiungo che i file cancellati non risultano piu presenti al sistema operativo e che quindi non è possibile scoprire se ci sono ancora fisicamente su disco
Questo ritardo di scrittura determinato dal journaling può essere molto breve, puo capitare a volte che invece sia un po piu lungo, magari perchè il sistema è impegnato
Naturalmente un effetto del genere si evidenzia solo in caso di mancanza di alimentazione o crash del sistema che in genere sono eventi rari; nel mio caso invece può accadere con piu facilità dato l'utilizzo che faccio con raspberry ( e non posso usare un ups...)

Quindi la domanda a cui non riesco a dare risposta è semplicemente e solo:
perchè derivando la classe settings la funzione _free non viene sostituita da quella che scrivo io ma rimane attiva quella originale?
Presumo che avere a che fare con i metodi nascosti possa generare comportamenti diversi da quelli che ci si aspetta e qualche mal di testa in piu

Tutto il resto l'ho aggiunto per condividere una esperienza, ma mi rendo conto che ha generato solo confusione e non era il contesto giusto

Ribadisco che la soluzione piu semplice è copiare il codice originale di gb.settings e inserirlo nel mio codice facendo le opportune modifiche
ma così mi semplifico troppo la vita.....









« Ultima modifica: 06 Marzo 2021, 12:47:28 da Akrobaticone »
"e il naufragar m'è dolce in questo mar"

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
« Risposta #14 il: 06 Marzo 2021, 13:37:07 »

sembra che così non funziona e il metodo (o evento) _free continua a funzionare così come scritto nella classe genitrice.
embeh?
Citazione
Il motivo per cui ho deciso di derivare la classe Settings è che voglio evitare che alla sua distruzione ( e conseguente chiamata della funzione _free() avvenga il salvataggio del file di configurazione generato da Settings...
Ma, come ti è stato detto da kicco e da me esemplificato le cose non stanno così
Citazione
Tutto questo nasce dal fatto che Ext4 con journaling ritarda a volte la scrittura su disco...
Ma questo cosa ha a che vedere con il fatto di scrivere un tuo settings?

Aggiungo questo:
save di settings è principalmente utile laddove si sfutti il file durante il runtime ma è molto lento leggere e scrivere su disco, quindi è da evitare.
Scrivi sul file solo alla chiusura e scrivi su ram durante il runtime, naturalmente se lo puoi fare.
« Ultima modifica: 06 Marzo 2021, 13:42:41 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro