Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [VB.NET/CF] memoria deallocabile...

    Ragazzi, ho fatto un programmino per un ditta ke noleggia bicicletta, su un plamare della Datalogic, con laser incorporato.

    Il mio problema è che il programa quando parte occupa già di per se 6mb circa, come effettuo il login e quindi faccio una query al db per verificare l'utente, la memoria sale a 9mb circa, lasciando cosi neanche 1mb libero, e non libera memoria quando chiudo il login e passo all'applicazione.
    In questa situazione tipo, la memoria disponibile è troppo poca, o come effettuo 2 query di fila va in errore per "OutMemoryException".

    Effettuo "dispose" su ogni oggetto, "BeginUpdate" ed "EndUpdate" sugli oggetti ke lo richiedono, senza dimenticare "ResumeLayout" e "SuspendLayout" e gli forzo anche il "Collect" della Garbage Collection, ma il risultato non cambia, la memoria resta satura e va sempre in errore su una seconda query.
    Premetto che su altri Palmari con Window Mobile funge bene, e non arriva a saturare tutta la memoria.

    Ecco dati utili:
    OS: Windows CE 5.0
    Ram: 64 MB
    DB: SqlServer CE
    Linguaggio: VB.Net

    parte di codice dove alloca memoria e non la rilascia piu:

    Try
    'conn = New Data.SqlServerCe.SqlCeConnection(connStr)
    'conn.Open()
    Bar.Value += 2
    strSql1 = "SELECT * from dipendenti where Utente like '" & user & _
    "' and Pwd like '" & pwd & "'"

    objAdapter1 = New Data.SqlServerCe.SqlCeDataAdapter(strSql1, connStr1)

    Bar.Value += 2

    'inizializzo il DATASET
    objDataset1 = New Data.DataSet()

    Bar.Value += 2

    'recupero i dati dalla tabella specificata con il DataAdapter
    'e li metto nel DataSet (objDataset)
    ----> objAdapter1.Fill(objDataset1, "Dipendenti")

    'dichiaro una variabile TABLE1 da riempire con
    'i record della/e tabella/e caricata/e con il DATASET
    tableRS1 = objDataset1.Tables


    objAdapter1.Dispose()
    objDataset1.Dispose()

    objAdapter1 = Nothing
    objDataset1 = Nothing

    .....................

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,465
    Secondo me, è ininfluente fare il Dispose di un DataSet se si stanno utilizzando degli oggetti correlati per la loro visualizzazione, ad esempio.

    Comunque sia, se il tuo codice è contenuto all'interno di un metodo, tutte le variabili cadranno fuori dallo "scope" appena questo termina, consentendo al GC di liberare quanta più memoria possibile. Non dovrebbe essere necessario, quindi, un tuo intervento manuale, se non per coadiuvare il rilascio delle risorse (annullando qualche riferimento a Nothing e così via), ma non penso si tratti di operazioni fondamentali.

    Hai verificato che l'occupazione di memoria sia effettivamente incrementale, oppure che il dispositivo mobile soddisfi i requisiti del framework? Potrebbe essere che la RAM sia comunque scarsa o insufficiente a far funzionare l'applicazione.

    Per quanto riguarda BeginUpdate, EndUpdate, SuspendLayout e ResumeLayout, non penso che abbiano un'influenza diretta sulla RAM allocata, ma dovrebbero servire sostanzialmente per bloccare gli "effetti collaterali" delle modifiche apportate alle proprietà degli oggetti interessati (es. evitando la generazione di eventi fino al termine dell'operazione).

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Originariamente inviato da alka
    Secondo me, è ininfluente fare il Dispose di un DataSet se si stanno utilizzando degli oggetti correlati per la loro visualizzazione, ad esempio.

    Comunque sia, se il tuo codice è contenuto all'interno di un metodo, tutte le variabili cadranno fuori dallo "scope" appena questo termina, consentendo al GC di liberare quanta più memoria possibile. Non dovrebbe essere necessario, quindi, un tuo intervento manuale, se non per coadiuvare il rilascio delle risorse (annullando qualche riferimento a Nothing e così via), ma non penso si tratti di operazioni fondamentali.

    Hai verificato che l'occupazione di memoria sia effettivamente incrementale, oppure che il dispositivo mobile soddisfi i requisiti del framework? Potrebbe essere che la RAM sia comunque scarsa o insufficiente a far funzionare l'applicazione.

    Per quanto riguarda BeginUpdate, EndUpdate, SuspendLayout e ResumeLayout, non penso che abbiano un'influenza diretta sulla RAM allocata, ma dovrebbero servire sostanzialmente per bloccare gli "effetti collaterali" delle modifiche apportate alle proprietà degli oggetti interessati (es. evitando la generazione di eventi fino al termine dell'operazione).

    Ciao!
    Grazie Alka, noto ke sei sempre presente (fortunatamente)
    ke io sappia, fare il dispose aiuta a liberare risorse, cosi come i BeginUpdate, EndUpdate, SuspendLayout e ResumeLayout, aiutano a non allocarne di inutile, comunque lasciando stare questo...

    La memoria si è sufficiente in quanto la maggior parte dei palmari ha 64 MB, sono pochi quelli con 128 MB, e su un palmare precedente funzionava bene.
    C'è stata la necessità di cambiare apperecchio perche li c'era un lettore di codici a barre esterno, mentre qui è incorporato.

    Le routine erano all'interno del pulsante di Login, ho provato a spostarla in una Function ma il discorso non cambia.
    Ho fatto un analisi maniacale, ma non riesco a trovare niente ke mi possi aiutare, in pratica mi succede questo:

    memoria dispo.: 29 MB
    memoria x Storage: 5 MB
    -di cui in uso in media sui 4 MB
    memoria x Programmi: 24 MB
    -di cui 13 MB in uso a OS avviato
    -avviando il programma si arriva a 18,6 MB
    --dopo il login si arriva a 21 MB, e da qui non riesco piu a liberare spazio...

    sono disperato....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.