Ocistiti memoriju programa [VB]

1

Ocistiti memoriju programa [VB]

offline
  • Pridružio: 14 Feb 2008
  • Poruke: 12392

Pozdrav, imam problema, skoro sam krenuo sa VB.NET, pa nisam upoznat sa novim terminima.
Recimo sta je trenutno problem.
U Resources imam 2 slike png format.
Napravio sam jedan picture box, i kada korisnik klikne na sliku, slika se samo promeni u drugu sliku koja se nalazi u resource, i na ovaj nacin ucitava u memoriju. Problem je sto stalno ucitava u memoriju, i kada bih ja 100 puta kliknuo na sliku od 10kb on bi napravio 10.000 kb memorije za dzabe.

Da docaram

Resource ( Slika 1, Slika 2)
Forma
Picture Box
Klik na picture box
promeni sliku iz 1 u 2 i obratno.

Evo koda, nadam se da ce neko pomoci, pokusao sam sa dispose narebom, ali problem je sto skroz izbaci iz memorije sliku pa ne sluzi nicemu.

  Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles zvz1.Click         zvz1.Image = My.Resources.zvzon         zvz2.Image = My.Resources.zvzoff         zvz3.Image = My.Resources.zvzoff         zvz4.Image = My.Resources.zvzoff         zvz5.Image = My.Resources.zvzoff     End Sub


zvz1 je ime picture box-a,
zvzon (slika 1)
zvzoff (slika 2)

Imam 5 picture boxa, i svaki put kad kliknem da promenim sliku doda u memoriju KB i tako gomila.

Hvala



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 25 Maj 2007
  • Poruke: 114
  • Gde živiš: Novi Sad, Sombor

Ne znam ni ja bas .NET ali da probas ovako:
Recimo, dodas jos 2 PictureBox-a koja su nevidljiva (Visible=False)
u prvi ubacis jednu sliku
zvzPriv1.Image <- ubacis sliku 1
u drugi drugu
zvzPriv2.Image <- ubacis sliku 2

i posle samo

zvz1.Image = zvzPriv1.Image zvz2.Image = zvzPriv2.Image zvz3.Image = zvzPriv2.Image zvz4.Image = zvzPriv2.Image zvz5.Image = zvzPriv2.Image



offline
  • Pridružio: 14 Feb 2008
  • Poruke: 12392

karlos ::Ne znam ni ja bas .NET ali da probas ovako:
Recimo, dodas jos 2 PictureBox-a koja su nevidljiva (Visible=False)
u prvi ubacis jednu sliku
zvzPriv1.Image <- ubacis sliku 1
u drugi drugu
zvzPriv2.Image <- ubacis sliku 2

i posle samo

zvz1.Image = zvzPriv1.Image zvz2.Image = zvzPriv2.Image zvz3.Image = zvzPriv2.Image zvz4.Image = zvzPriv2.Image zvz5.Image = zvzPriv2.Image


Razumem te, evo probacu.
I dalje isto trpa u memoriju. Confused

offline
  • pixxel  Male
  • Legendarni građanin
  • Pridružio: 21 Jun 2005
  • Poruke: 9091
  • Gde živiš: Tu i tamo...

Ne znam dobro vb , pogotovo ne .net, ali moras da poradis na memory managementu. U cemu je problem - ako eksplicitno ne trazis da se oslobodi memorija, sam program nece osloboditi istu. Sta se desava - ti napravis picture box, i u njegovom kodu napises (kao gore) sta treba da se nalazi kao slika u tih 5 boxova (zvezdice, nebitno Wink ). Sta radi vb - on cita tvoj kod koji kaze ako kliknes ovde, ucitaj 5 slika, jednu koja ze zvzon i cetiri puta zvzoff. I on ih odma' ucita u memoriju. VB ne zna (ne interesuje ga) da li su te slike iste, pa kad kliknes na drugi box, on to opet radi. I tako X puta, dakle svaki klik na neki box ce da alocira memoriju za slike. Posto nemas eksplicitni menadzment memorije (ucitavanje resursa kad su potrebni, oslobadjanje kad nisu), sve si prepustio visual basicovom garbage collectionu, koji se ponasa ovako: ako ne moram, necu nista da uklanjam iz memorije, dok se forma ili program ne ugasi.
Sad mi zao sto sam odjavio .net programiranje, i presao na internet programiranje, mogao bih jos da ti izdetaljisem, ali ovako sve je neko davno secanje...

offline
  • Pridružio: 14 Feb 2008
  • Poruke: 12392

pixxel ::Ne znam dobro vb , pogotovo ne .net, ali moras da poradis na memory managementu. U cemu je problem - ako eksplicitno ne trazis da se oslobodi memorija, sam program nece osloboditi istu. Sta se desava - ti napravis picture box, i u njegovom kodu napises (kao gore) sta treba da se nalazi kao slika u tih 5 boxova (zvezdice, nebitno Wink ). Sta radi vb - on cita tvoj kod koji kaze ako kliknes ovde, ucitaj 5 slika, jednu koja ze zvzon i cetiri puta zvzoff. I on ih odma' ucita u memoriju. VB ne zna (ne interesuje ga) da li su te slike iste, pa kad kliknes na drugi box, on to opet radi. I tako X puta, dakle svaki klik na neki box ce da alocira memoriju za slike. Posto nemas eksplicitni menadzment memorije (ucitavanje resursa kad su potrebni, oslobadjanje kad nisu), sve si prepustio visual basicovom garbage collectionu, koji se ponasa ovako: ako ne moram, necu nista da uklanjam iz memorije, dok se forma ili program ne ugasi.
Sad mi zao sto sam odjavio .net programiranje, i presao na internet programiranje, mogao bih jos da ti izdetaljisem, ali ovako sve je neko davno secanje...


Totalno si u pravu sto se tice ovog Garbace Collection-a.
E sad sta je Eksplicitni manadzment memorije?
Inace imam isti problem koji trebam da resim, koristim windows media player komponentu za stream radio, problem je sto ona samo gura u memoriju taj stream, a nikako da cisti, sem u slucaju kada promenim stanicu. Razmisaljam kako to da uraidm. Nebitno, mozes li da mi objasnis samo sta je to Eksplicitni manadzment memorije, ja cu pogledati po netu sta je to.

offline
  • Pridružio: 25 Maj 2007
  • Poruke: 114
  • Gde živiš: Novi Sad, Sombor

U krajnjem slucaju ako ne uspes da oslobodis memoriju ubaci 2x5 PictureBox-a, 5 sa jednom slikom, a 5 sa drugom.I posle im samo menjas osobinu visible = true (false).

Jeste da nije najelegantnije resenje ali ces na taj nacin ucitati samo 10 slika u tvom slucaju 100 kB.

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

U .Net-u ne mozes eksplicitno da unistis objekat. Cak i kad klasa implementira IDisposable interfejs, i ti pozoves dispose, to ne znaci da ce objekat biti oslobodjen. Cak i kad eksplicitno kazes GC-u da pobrise "djubre", objekti mogu da ostanu u memoriji, ali to ne treba da te brine.
Svi managed objekti ce kad tad biti obrisani od strane samog .Net-a, i to sto memorija raste ne treba da te brine. .Net je tako napravljen da kad aplikacija zauzme odredjenu kolicinu rama, GC automatski brise sve suvisne objekte. Tvoja aplikacija nikad nece zauzeti, recimo 500MB rama zato sto klikas dugme... doci ce do recimo 20MB i onda ce tu negde ostati jer ce GC poceti da cisti nepotrebne objekte.

Jedino na sta moras da obracas paznju su non-managed objekti (Win handles, file handles, objekti iz eksternih non-managed biblioteka). Za njihovo brisanje se koristi odredjena funkcija klase koja ih koristi. Kod fajlova, recimo, treba da pozoves Close funkciju. Ta funkcija ce osloboditi sve sistemske resurse, ali ce .Net objekat i dalje biti u memoriji. Na kraju krajeva, ne moras cak ni Close da pozivas jer ce GC eventualno obrisati objekad koji je otvorio fajl i time osloboditi i sistemske resurse, ali ako cekas na GC da to uradi za tebe, nikad ne znas kad ce se to tacno desiti, i yato po dokumentacijama pise da Close treba pozivati kada se zavrsi sa citanjem/pisanjem podataka kada su fajlovi u putanju.

Eto... probaj da klikas dugmence neko vreme pa ces videti da se memorija ipak oslobadja Smile

offline
  • Pridružio: 14 Feb 2008
  • Poruke: 12392

@ karlos
To resenje ne dolazi u obzir, ali hvala

@Srki
Pa kad bas nista ne mogu da uradim ... prepustam njemu.
Sada jos samo da resim ovo sa wmp komponentom.
Da li uopste mogu da brisem memoriju?
Recimo kad windows media player komponenta ucita u memoriju 1mb stream muzike sa interneta, da isprazni tu memoriju i da ponovo puni do 1mb pa da brise.
Mislim da ovo nije moguce, gresim li?

offline
  • pixxel  Male
  • Legendarni građanin
  • Pridružio: 21 Jun 2005
  • Poruke: 9091
  • Gde živiš: Tu i tamo...

To vec zavisi od toga kako je komponenta napisana...

Sto se tice eksplicitnog menadzmenta memorije, eksplicitno bi znacilo da TI iniciras kad hoces i sta hoces da ubijes iz memorije (recimo napravis klasu koja ima konstruktore, i napises destruktor - kad se clanovi klase nuliraju, i pozove destruktor, on bi trebao da oslobodi memoriju), ali eto srki rece da to u .netu ne moze...

offline
  • Pridružio: 14 Feb 2008
  • Poruke: 12392

pixxel ::To vec zavisi od toga kako je komponenta napisana...

Sto se tice eksplicitnog menadzmenta memorije, eksplicitno bi znacilo da TI iniciras kad hoces i sta hoces da ubijes iz memorije (recimo napravis klasu koja ima konstruktore, i napises destruktor - kad se clanovi klase nuliraju, i pozove destruktor, on bi trebao da oslobodi memoriju), ali eto srki rece da to u .netu ne moze...

Izgleda da nema nista od toga Mr. Green
Sad sam gledao, wmp ne moze da uradi ono sto sam hteo.
Inace hvala svima na pomoci, svi ste pomogli, i naucio sam nesto novo Zagrljaj
Pozdrav Ziveli

Ko je trenutno na forumu
 

Ukupno su 644 korisnika na forumu :: 4 registrovanih, 1 sakriven i 639 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: cikadeda, havoc995, JOntra, vathra