112 messaggi dal 01 febbraio 2017
Rieccomi , cosa bisogna fare per una cassa di birra ... eheheheh ...

E allora , qualche considerazione.
In basso il tuo codice rivisto, ho implementato AWAIT come ti dicevo, e a livello di test ho incrementato la frequenza del times, per farlo 'sballare' prima.

Ho cambiato le due sub che usavi, trasmormandole in function in modo da evitare il problema del deadlock di memusata.

Ho impementato il deviatore, in modo che la prima esecuzione della function memtest, la disattiva automaticamente, senza introdurre altri cicli di attesa per il timer come avevi fatto .... il timer può lanciare anche duemila volte la sub, ma se c'è ancora una istanza attiva del vecchio task, uscirà automaticamente. Ovviamente a questo punto si poteva lasciare la sub, ma a livello didattico ho preferito darti altri spunti.

La stessa tecnica del deviatore è usata anche per TestOrario, anche se in realtà nn serve.

Poi trovi disattivata un'altra tecnica (dentro la SUB Timer1_Click), è quella del task dichiarato come globale, in testa, in modo tale da evitare di dichiararlo ogni volta, è un altro modo di chiamare la SUB che ti interessa.

Ovviamente sono semplici attrezzi di esempio che puoi usare per comporre il resto del puzzle ed ottenere quello che hai descritto poco fa. Puoi usare una tecnica o più di una, ho messo dentro un poco dei suggerimenti che ti davo qualche giorno fa.

Ah, piccola aggiunta in textbox2 metto i valori di memoria ad inizio programma, per vedere di quanto aumentano via via ... in alcuni casi addirittura la memoria impegnata dopo qualche ora è diventata di meno rispetto a quando è partito il programma.

Non ho potutto tenere acceso per giorni per vedere che succede.
Implementalo, provalo e ci dai esito.

PS. In fase di produzione, nn serve una frequenza così elevata del timer, lo puoi pure portare a 500ms tanto ti deve solo leggere dei valori e visualizzarli, se li leggi 10 volte al secondo non è che l'occhio umano li apprezza.
PPS. Ci sono (ovviamente) altri metodi per fare le stesse cose, poi naturalmente ognuno sceglie il modo o gli strumenti che preferisce (ad esempio potresti implementare le letture come servizi windows che si attivano automaticamente).

Ciao.
Gino.

Imports System.Globalization

Public Class Form1

    Dim ScriviVecchioPicco As Integer = 0
    Dim TestOrario As String = ""
    Dim VecchioPicco As Integer = 0
    Dim WithEvents timer1 As New Timer
    Dim dev As Integer = 0
    Dim attiv1 As Integer = 0
    Dim task1 As Task
    Dim attiv2 As Integer = 0

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Me.Show()
        Me.CenterToScreen()

        timer1.Interval = 10
        timer1.Enabled = True

    End Sub

    Private Function bb() As String
        Return MEM_USATA()
    End Function

    Private Function CaricaMemoria_Async() As Task(Of String)
        Return Task.Run(Function() bb())
    End Function

    Private Async Sub Generale()
        Dim resul = Await CaricaMemoria_Async()
        TextBox3.Text = resul
        If dev = 0 Then
            dev = 1
            TextBox2.Text = resul
        End If

        If ScriviVecchioPicco = 1 Then
            ScriviVecchioPicco = 0
            TextBox3.Text = resul
        End If

    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Generale()
        'task1 = New Task(AddressOf ORARIO)
        'task1.Start()
        'TextBox3.Text = TestOrario
        TextBox1.Text = ORARIO()
    End Sub

    Function ORARIO() As String
        If attiv2 = 1 Then
            Return ""
        End If
        attiv2 = 1
        Return Format(Now.ToString("G", New CultureInfo("it-IT")))
        attiv2 = 0
    End Function

    Function MEM_USATA() As String
        If attiv1 = 1 Then
            Return ""
        End If
        attiv1 = 1
        Dim c As Process = Process.GetCurrentProcess()
        Dim MemUsata = String.Empty
        Dim mem = c.WorkingSet64 / 1024

        MemUsata &= Format(Now.ToString("G", New CultureInfo("it-IT"))) & " --- "
        MemUsata &= "WS: " & mem & " K - "
        MemUsata &= "VM: " & c.PagedMemorySize64 / 1024 & " K - "
        MemUsata &= "GC: " & GC.GetTotalMemory(True) & " b" & vbCrLf

        If (mem) > VecchioPicco Then
            VecchioPicco = mem
            ScriviVecchioPicco = 1
        End If
        attiv1 = 0
        Return MemUsata
    End Function

End Class

UNSTRING identifier-1 id-2 id-3
DELIMITED BY [ALL] OR [ALL] literal-1 lit-2
INTO {id-4 [DELIMITER IN id-5]
[COUNT IN id-6]}
[WITH POINTER id-7]
[TALLYING IN id-8]
[ON OVERFLOW imperative-statement-1]
[NOT ON OVERFLOW imper-2]
[END-UNSTRING]
17 messaggi dal 30 marzo 2017
ciao gino
sono curiosissimo di vedere cosa hai fatto.
copio incollo il codice, metto tutto a cuocere e ti faccio sapere.
per ora, ma solo per ora, grazie.
a dopo.
peppe

---->
ho dovuto modificare qualcosa perchè non mi partiva (vari imports e il timer)
in ogni caso leggendo il codice noto che io sono molto molto obsoleto, probabilmente perchè legato ancora ad un micro filo di abitudine del modo di programmazione di vb6 (abbandonato ormai da 5 anni)
continuo nello studio del tuo codice ... in ogni caso la memoria usata dal tuo codice non aumenta.
Modificato da fotosettore2 il 26 marzo 2020 20:54 -
17 messaggi dal 30 marzo 2017
ciao gino
allora ... dopo la modifica del mio programma, seguendo quanto tu hai fatto nella tua demo e dopo 2 gg di funzionamento ininterrotto, ho notato che mooooolto lentamente la memoria continua a lievitare, ma questo di certo dipende da qualche variabile che io non ho azzerato. Debbo controllare meglio ma il codice ha circa 20 moduli e migliaia di righe.
In ogni caso quello che accadeva prima non succede più, cioè il fatto che ci fossero incrementi titanici causati dal mio malomodo di programmare cose di certo superiori al mio attuale stato di conoscenza.

Ho notato, inoltre, che anche se la memoria si incrementa, in effetti poi si scarica (non del tutto) ed in ogni caso non ha mai bloccato il programma.

Una cosa che non ho visto è il "dispose", che non hai utilizzato per nulla o che forse è implicito. Ti sarei grato se mi spiegassi questa cosa o se mi dicessi dove posso trovare ulteriori info in proposito.

Quello che sto facendo lo trovi qui : www.lucibus.com
E' un programma per la gestione dei pannelli solari e delle batterie negli impianti solari off-grid.
Nato prima in VB6, l'ho poi riscritto in VB2015 perchè avevo appunto bisogno di far girare contemporaneamente
molte cose e sopratutto doveva avere la grafica in varie lingue, cirillico compreso, cosa che il vb6 non permetteva di fare.

Per ultimo volevo sapere se era possibile contattarti in privato, perchè qui non vedo link per MessPriv, che di solito (sul mio forum anche) sono a disposizione degli utenti.

Attendo info
Ti ringrazio
peppe
112 messaggi dal 01 febbraio 2017
fotosettore2 ha scritto:
ciao gino
allora ... dopo la modifica del mio programma, seguendo quanto tu hai fatto nella tua demo e dopo 2 gg di funzionamento ininterrotto, ho notato che mooooolto lentamente la memoria continua a lievitare, ma questo di certo dipende da qualche variabile che io non ho azzerato. Debbo controllare meglio ma il codice ha circa 20 moduli e migliaia di righe.
In ogni caso quello che accadeva prima non succede più, cioè il fatto che ci fossero incrementi titanici causati dal mio malomodo di programmare cose di certo superiori al mio attuale stato di conoscenza.

Il mio codice nn voleva essere la soluzione del tuo problema, ma qualche esempio (come chiedevi) da cui partire per adottare alcune tecniche per allegerire la memoria. Quindi fare copia ed incolla senza capirne il funzionamento delle diverse parti che ti ho elencato in presentazione, non ti fa progredire. Certo capisco la voglia di voler risolvere il problema da cui sei impantanato da tempo, ma la mia cassettina di attrezzi era da affinare e adattare. Ci sono diversi spunti che ho descritto nel mio post di presentazione, poco prima del codice. Come ti dicevo c'era anche una parte di codice disabilitata, che era un'altra soluzione oltre ad altre che ho menzionato ma non codificato.



Ho notato, inoltre, che anche se la memoria si incrementa, in effetti poi si scarica (non del tutto) ed in ogni caso non ha mai bloccato il programma.

Se hai risolto il problema la cosa non può che farmi piacere.
Bene !



Una cosa che non ho visto è il "dispose", che non hai utilizzato per nulla o che forse è implicito. Ti sarei grato se mi spiegassi questa cosa o se mi dicessi dove posso trovare ulteriori info in proposito.

Il dispose non serve in quanto nn ci sono oggetti che vengono creati ad ogni ciclo. In ogni caso è il CLR che si occupa di 'pulire' la memoria e segue le sue regole, che nn sempre coincidono con quello che ci aspettiamo. Dovresti studiare un poco in proposito (prova nella documentazione ufficiale MS).
Anche il Task che è dichiarato globalmente, viene riutilizzato (nel codice disabilitato), proprio per evitare di dichiaralo nella SUB e poi pulirlo (non si sa quando), o aver il problema di gestirne il termine.
Senza contare che la creazione di un oggetto e la relativa 'pulizia' sono operazioni onerose per il CLR anche in termini di prestazioni.


Quello che sto facendo lo trovi qui : www.lucibus.com
E' un programma per la gestione dei pannelli solari e delle batterie negli impianti solari off-grid.
Nato prima in VB6, l'ho poi riscritto in VB2015 perchè avevo appunto bisogno di far girare contemporaneamente
molte cose e sopratutto doveva avere la grafica in varie lingue, cirillico compreso, cosa che il vb6 non permetteva di fare.

Ottimo lavoro, se avessi tempo ... è un campo che mi appassiona .. assieme ad Arduino ...


Per ultimo volevo sapere se era possibile contattarti in privato, perchè qui non vedo link per MessPriv, che di solito (sul mio forum anche) sono a disposizione degli utenti.

Attendo info
Ti ringrazio
peppe

Effettivamante è strano, neanche io trovo un pulsante per un messaggio privato, se c'è è nascosto bene, nel profilo prevede solo un contatto messenger.
Ti do la mia mail pubblica che è collegata al mio sito www.rgbcomputer.it.
Il mio contatto è mail@rgbcomputer.it

Ciao.
Gino.

UNSTRING identifier-1 id-2 id-3
DELIMITED BY [ALL] OR [ALL] literal-1 lit-2
INTO {id-4 [DELIMITER IN id-5]
[COUNT IN id-6]}
[WITH POINTER id-7]
[TALLYING IN id-8]
[ON OVERFLOW imperative-statement-1]
[NOT ON OVERFLOW imper-2]
[END-UNSTRING]
17 messaggi dal 30 marzo 2017
>>>> Quindi fare copia ed incolla senza capirne il funzionamento delle diverse parti che ti ho elencato in presentazione, non ti fa progredire

ciao gino
no no ... per ora ho fatto un mezzo copia incolla perchè ho dovuto risolvere al volo il problema di base, lamentato da molti utenti.
Adesso che stiamo in quarantena mi dedichero di certo - con adeguata concentrazione - a come funziona il tutto, anche perchè io sono stato sempre quello che fin da piccolo apriva le cose appena comprate per capire come funzionavano.
C'è il famoso proverbio, che ripeto spesso ai miei figli : "Portarvi il pesce pescato va bene la prima volta : sappiate che al più presto dovete imparare a pescare".
Infine : Arduino è stato un mio risveglio, visto che l'elettronica che avevo fatto per hobby in gioventù era stata abbandonata a favore dei pc.
Ho coniugato il sapere saldare e conoscere abbastanza a fondo quel mondo con quello della programmazione.
Ne sono usciti vari progetti, uno dei quali è collegato a lucibus.
Questo è il video : https://www.youtube.com/watch?v=gfIxrc_JO1s
Fine off topic, gli amministratori mi scuseranno; ma se andiamo a vedere ho in fondo fatto funzionare molte cose del mondo arduino con codice vb2015.
Studio e ci risentiamo, sperando nella tua pazienza !
Modificato da fotosettore2 il 30 marzo 2020 11:00 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.