Gambas-it

Gambas3 => Programmazione => Topic aperto da: akrobaticone - 05 Marzo 2021, 09:40:27

Titolo: Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: akrobaticone - 05 Marzo 2021, 09:40:27
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?


Titolo: Re:Inherits e metodi nascosti
Inserito da: Gianluigi - 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:
Titolo: Re:Inherits e metodi nascosti
Inserito da: vuott - 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
Titolo: Re:Inherits e metodi nascosti
Inserito da: Gianluigi - 05 Marzo 2021, 14:23:25
 :-X

Titolo: Re:Inherits e metodi nascosti
Inserito da: Gianluigi - 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:
Titolo: Re:Inherits e metodi nascosti
Inserito da: vuott - 05 Marzo 2021, 16:37:18
:-X
Ok, ho visto il tuo esempio.
Come non detto.
Titolo: Re:Inherits e metodi nascosti
Inserito da: akrobaticone - 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 (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
Titolo: Re:Inherits e metodi nascosti
Inserito da: Gianluigi - 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:
Titolo: Re:Inherits e metodi nascosti
Inserito da: kicco - 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:
Titolo: Re:Inherits e metodi nascosti
Inserito da: akrobaticone - 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


 
Titolo: Re:Inherits e metodi nascosti
Inserito da: akrobaticone - 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.....
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: Gianluigi - 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:
Titolo: Re:Inherits e metodi nascosti
Inserito da: Gianluigi - 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...  :-\
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: akrobaticone - 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.....









Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: Gianluigi - 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.
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: akrobaticone - 06 Marzo 2021, 14:13:47
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

è il codice della classe settings del componente gb.settings nel codice sorgente di gambas

provate il codice che allego

non faccio nessun salvataggio di settings





Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: Gianluigi - 06 Marzo 2021, 14:26:03
Se puoi per il momento cancellare dalla tua mente _free e rispondere a questa domanda:

il codice che ho allegato prima lo hai provato?

Se lo hai provato quando chiudi la form vale a dire il programma, ti salva Clarabella?
Perché a me non la salva e per deduzione logica significa che di default settings non salva a meno che non istruisci il programma diversamente.

Mi auguro che così sia più comprensibile  :ciao:
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: akrobaticone - 06 Marzo 2021, 15:02:49
Prova a togliere l'ultima istruzione
settings.wriite(me)
nel tuo codice

La mia applicazione è molto specifica e il problema fondamentale è che le impostazioni le devo salvare subito poichè potrebbe succede che venga  a mancare la tensione  ciò che ho modificato andrebbe perso, quindi ogni volta che modifico un parametro faccio subito settings.save
Il problema è che se lo fa comunque alla fine ci sono probabilità di corruzione del file .conf poichè potrebbe accadere che venga tolta immediatamente ( ma è un problema della mia configurazione e non comune a tutti, lo definirei un problema di nicchia...)

quello che non riuscivo a capire e cio che ha generato l'esigenza di chiedere informazioni con un post era la questione riguardante inherits

dalla wiki avevo inteso che ogni volta che si deriva una classe da un altra se scrivo una funzione con lo stesso nome di una presente nella classe geniitrice  essa si sostituisce a quest'ultima
se però voglio richiamare la funzione originale posso farlo usando SUPER
evidentemente questo meccanismo non funziona, o funziona in maniera differente con i metodi nascosti nella classe settings
perlomenno questo credo di aver capito
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: Gianluigi - 06 Marzo 2021, 16:38:34
Prova a togliere l'ultima istruzione
settings.wriite(me)
nel tuo codice


Con Settings.Read(Me) leggi le misure della form e con Settings.Write(Me) le scrivi.
L'ho inserito per farti comprendere che solo se scrivo i dati in settings questi si salvano, a differenza di Clarabella.

Se togli Settings.Write(Me) succede che non memorizzi i cambiamenti delle dimensioni della finestra, ma mi fa anche capire che non hai provato il mio codice.

Per comprendere il codice da me postato devi cambiare la dimensione della finestra, chiudere e riaprire.

Circa _free con un settings ereditato ti serve o è solo una curiosità?

Perché sembra che tutto nasca da un malinteso quello che settings salvi di default.

Se il file di settings si corrompe non sarà certo _free a dirtelo, se manca la luce non esiste codice che salvi quello che stai facendo al momento.

Per sapere se è mancata la luce o comunque il programma è crashato ti basta un booleano che porti a True all'apertura salvandolo in settings e poi alla chiusura lo riporti a false.
All'apertura lo leggi e se è rimasto a true prendi i provvedimenti del caso.

Oppure non ho capito di cosa stiamo parlando, il che è possibilissimo.
In quest'ultimo caso se vuoi aiutare/ti alleghi una piccola applicazione che esemplifichi il tutto.
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: kicco - 06 Marzo 2021, 16:49:54
@Akrobaticone
Anch'io uso in più di un programma settings.
Provvedo a memorizzare dei dati sia durante la configurazione da parte dell'utente all'interno del programma stesso ed altri parametri all'uscita del programma.
Le sole volte nelle quali ho avuto problemi di "corruzione" del file .conf, dipendeva da miei errori del codice.
Citazione
Prova a togliere l'ultima istruzione
settings.wriite(me)
nel tuo codice
Non genera il file .conf, come mi aspettavo...
 :ciao:
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: akrobaticone - 06 Marzo 2021, 18:05:38
vuoi ridere?
a me lo genera ogni volta e lo sovrascrive con la settings.write commentata
lo cancello ogni volta per sicurezza ho svuotato anche il cestino
per la cronaca la sovrascrittura del file viene eseguita solo se ci sono state modifiche ad almeno una chiave

poi la funzione
settings.write(me) salva le impostazioni della geometria del form
tutte le altre chiavi vengono salvate con
settings.save
infatti se vai a vedere nel file .conf si genera un'altra chiave

Codice: [Seleziona]
[FMain]
Geometry=[459,148,448,448,0]

Ho dato una spulciata anche alla wiki
https://www.gambas-it.org/wiki/index.php?title=Uso_della_classe_Settings (https://www.gambas-it.org/wiki/index.php?title=Uso_della_classe_Settings)

Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: kicco - 06 Marzo 2021, 18:25:34
ma solo su raspberry con Ubuntu server ??
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: Gianluigi - 06 Marzo 2021, 18:31:19
vuoi ridere?
a me lo genera ogni volta e lo sovrascrive con la settings.write commentata


A me non succede e non deve succedere, c'è qualcosa che non va nel tuo Gambas.
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: kicco - 06 Marzo 2021, 18:34:54

A me non succede e non deve succedere, c'è qualcosa che non va nel tuo Gambas.
Concordo!
Prova a vedere se riesci a fare qualcosa altrimenti, scrivi un miniprogrammino che vedo di farlo girare su Raspberry + Ubuntu 20.10.
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: akrobaticone - 06 Marzo 2021, 18:50:08
Ragazzi non so cosa dirvi
Gambas installato da ppa e provato su 6 pc diversi  ( linux mint, ubuntu xfce, ubuntu kde) piu installazione su raspberry compilato da sorgenti
in ogni caso allego il programma così come lo pensavo con la modifica alla classe settings

Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: kicco - 06 Marzo 2021, 19:46:50
Ma tu non usi il componente gb.settings?  :rolleyes:
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: akrobaticone - 06 Marzo 2021, 20:11:21
se guardi il codice la classe settings l'ho importata nel mio codice e modificata secondo quanto avevo bisogno
In questo caso è necessario non abiltare il componente gb.settings
in TUTTI gli altri esempi che ho precedentemente postato il componente gb.settings era abilitato
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: kicco - 06 Marzo 2021, 20:28:08
Mi sembra funzioni correttamente!

Dopo il
Codice: [Seleziona]
settings["test"] = casuale
io metto normalmente
Codice: [Seleziona]
Settings.save

ma comunque funziona.
Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: akrobaticone - 06 Marzo 2021, 20:36:50
Mi sembra funzioni correttamente!

Dopo il
Codice: [Seleziona]
settings["test"] = casuale
io metto normalmente
Codice: [Seleziona]
Settings.save

ma comunque funziona.

appunto...
settings.save non serve poichè la routine _free() della classe settings ci pensa da sola a salvare la configurazione senza bisogno di salvarla manualmente quando l'applicazione si chiude
e nella mia settings modificata blocco l'esecuzione con una if condizionata dalla proprietà abilita

Questa discussione mi sembra la maratona di telethon.... ;)
Grazie per la pazienza.... ;D ;D ;D

EDIT:
Settings.save serve perchè salva immediatamente la configurazione ( e quindi all'uscita non viene di nuovo eseguito)
se all'uscita viene rilevato che qualche cosa è cambiato e non è stato ancora salvato allora viene chiamato lo stesso il metodo .save dalla routine _free()
Quindi se non salviamo noi manualmente i cambiamenti verranno comunque salvati in automatico all'uscita
 



Titolo: Re:Componente Gb.Settings, funzione Inherits e metodi nascosti
Inserito da: akrobaticone - 09 Marzo 2021, 09:00:36
Qualche modifica è stata fatta dopo che avevo sollevato il problema, prima in mailing list e dopo nel bugtracker
https://gitlab.com/gambas/gambas/-/commit/f8b345d9e63b69db01085dd1a8b90058c5c754d7 (https://gitlab.com/gambas/gambas/-/commit/f8b345d9e63b69db01085dd1a8b90058c5c754d7)
il mio approccio non era corretto, ma qualche cosa ha sortito lo stesso
tutta da provare