Poslao: 08 Dec 2009 21:12
|
offline
- Srki94
- Mod u pemziji
- Pridružio: 14 Feb 2008
- Poruke: 12403
|
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.
|
|
Poslao: 08 Dec 2009 21:50
|
offline
- karlos
- Građanin
- 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
|
|
|
|
Poslao: 08 Dec 2009 22:38
|
offline
- Srki94
- Mod u pemziji
- Pridružio: 14 Feb 2008
- Poruke: 12403
|
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.
|
|
|
|
Poslao: 08 Dec 2009 23:47
|
offline
- pixxel
- 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 ). 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...
|
|
|
|
Poslao: 08 Dec 2009 23:54
|
offline
- Srki94
- Mod u pemziji
- Pridružio: 14 Feb 2008
- Poruke: 12403
|
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 ). 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.
|
|
|
|
Poslao: 09 Dec 2009 19:40
|
offline
- karlos
- Građanin
- 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.
|
|
|
|
Poslao: 09 Dec 2009 20:07
|
offline
- Srki_82
- Moderator foruma
- 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
|
|
|
|
Poslao: 09 Dec 2009 21:17
|
offline
- Srki94
- Mod u pemziji
- Pridružio: 14 Feb 2008
- Poruke: 12403
|
@ 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?
|
|
|
|
Poslao: 10 Dec 2009 00:03
|
offline
- pixxel
- 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...
|
|
|
|
|