Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    [vb.net] rilasciare tutte le risorse

    Dunque, una piccola applicazione windows crea dei files utilizzando una vecchia dll COM, cliccando su un pulsante.

    Questi files risultano sempre in uso fino a che non chiudo l'applicazione.
    Ebbene, senza chiudere l'applicazione, è possibile rilasciare tutte ma proprio tutte le risorse utilizzate da questa applicazione, ossia, ripristinare la situazione prima del click, o, detto in altri termini, chiudere virtualmente l'applicazione?
    Pietro

  2. #2
    Ma la suddetta dll COM non ha un metodo per rilasciare le risorse? Perchè probabilmente, se non vengono rilasciate (in questo caso sono dei file, quindi questi non vengono chiusi...) un motivo c'è... Ecco perchè in tutte le classi c'è un Apri() e un Chiudi(). Controlla bene nella dll, e se la dll l'hai creata tu, ancor meglio!
    Cerco ombrello vecchio, nuovo, moderno o antidiluviano; purché protegga da una pioggia che vien giù come Dio la manda. Fate presto che ho l’acqua alla gola. (Noè)

    C# programming and other stuffs

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da chipdb
    Ma la suddetta dll COM non ha un metodo per rilasciare le risorse? Perchè probabilmente, se non vengono rilasciate (in questo caso sono dei file, quindi questi non vengono chiusi...) un motivo c'è... Ecco perchè in tutte le classi c'è un Apri() e un Chiudi(). Controlla bene nella dll, e se la dll l'hai creata tu, ancor meglio!
    la vecchia dll la usavo benissimo con Access97, Powerbuilder6, VisualBasic6... e questo per dare l'idea di quanto sia vecchia.
    Purtroppo non funziona con una windows .Net, a meno di non chiudere l'applicazione ad ogni utilizzo.
    Ciao
    Pietro

  4. #4
    Originariamente inviato da pietro09
    la vecchia dll la usavo benissimo con Access97, Powerbuilder6, VisualBasic6... e questo per dare l'idea di quanto sia vecchia.
    Ma no dai! La maggior parte dei programmi gestionali in circolazione è creata con VB6 (i vecchi bei tempi VVoVe: !!)

    Comunque sia, essendo per l'appunto una tecnologia vecchia, male si sposa con il .net, che necessita di "certezze" nella sua applicazione. Ti consiglio di cercare qualcosa di più appropriato, o magari se non è nulla di complicato, di fare tu un aggiornamento alla dll.net! Perchè il problema qui è che se tu apri un file, lo devi anche chiudere, ma se non è chi lo apre a chiuderlo... tu non puoi farci nulla se non appunto chiudere l'applicazione stessa. Quindi o la dll chiude il file... o altrimenti

    Ciao
    Cerco ombrello vecchio, nuovo, moderno o antidiluviano; purché protegga da una pioggia che vien giù come Dio la manda. Fate presto che ho l’acqua alla gola. (Noè)

    C# programming and other stuffs

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    per il momento ho aggiunto Me.Close() alla fine dell'applicazione, ma forse la riscrivo in vb6 (che non ricordo più )

    Ciao
    Pietro

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    ci sono riuscito, finalmente

    alla fine della procedura metto:

    'tento il rilascio dell'oggetto com
    Marshal.FinalReleaseComObject(recs) : recs = Nothing

    'forzo il rilascio
    GC.Collect()
    GC.WaitForPendingFinalizers()

    MsgBox("ok")


    Pietro

  7. #7
    Se hai adottato questa soluzione vuol dire che non sei andato a vedere come lavora il Garbage Collector.
    Avresti potuto tranquillamente implementare il Dispose del tuo oggetto a manina e fare un SUppressFInalize. A questo punto prendevi tu le redini del Garbage COllector e decidi tu come 'svuotare' la memoria ...

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da raffaeu
    Se hai adottato questa soluzione vuol dire che non sei andato a vedere come lavora il Garbage Collector.
    Avresti potuto tranquillamente implementare il Dispose del tuo oggetto a manina e fare un SUppressFInalize. A questo punto prendevi tu le redini del Garbage COllector e decidi tu come 'svuotare' la memoria ...
    Abbi pazienza, ma la tua risposta presuppone che chi la legge abbia una certa competenza.
    Dato che non è il mio caso, non è che potresti essere meno criptico. Te ne sarei davvero grato. Ciao
    Pietro

  9. #9
    Cavolo ...
    Allora tu hai un oggetto e purtroppo non sai perchè resta 'impegnato' ...
    Questo vuol dire che non hai previsto nel tuo codice di 'auto-eliminarsi' dopo un certo periodo di inutilizzo, giusto?
    In questo caso esiste il Garbage Collector, ovvero la memoria intrinseca di NET, che a un certo punto, ma non nel tuo caso, svuota la memoria dagli oggetti non utlizzati.
    Per ovviare a cio' possiamo implementare, in una data classe, un metodo Dispose, che una volta richiamato, distrugge l' oggetto stesso.
    In questo articolo in lingua inglese viene proprio spiegato questo processo con VB con un bel pezzo di codice
    http://www.devcity.net/PrintArticle.aspx?ArticleID=93


  10. #10
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da raffaeu
    Cavolo ...
    Allora tu hai un oggetto e purtroppo non sai perchè resta 'impegnato' ...
    Questo vuol dire che non hai previsto nel tuo codice di 'auto-eliminarsi' dopo un certo periodo di inutilizzo, giusto?
    In questo caso esiste il Garbage Collector, ovvero la memoria intrinseca di NET, che a un certo punto, ma non nel tuo caso, svuota la memoria dagli oggetti non utlizzati.
    Per ovviare a cio' possiamo implementare, in una data classe, un metodo Dispose, che una volta richiamato, distrugge l' oggetto stesso.
    In questo articolo in lingua inglese viene proprio spiegato questo processo con VB con un bel pezzo di codice
    http://www.devcity.net/PrintArticle.aspx?ArticleID=93

    prima di addentrarmi nella lettura espongo bene il mio caso.
    Io ho un oggetto com che funziona perfettamente con vb6, powerbuilder, access, etc, ma non con .net.
    Il difetto è che i files creati con l'oggetto com risultano in uso e non riesco a cancellarli.
    Allora, come posso fare? come fare il dispose?
    Pietro

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.