Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6-ohjelma hidastuu

Sivun loppuun

Milu [22.06.2008 19:39:18]

#

Mistä mahtais johtua sellainen ilmiö.

Lataan isosta tiedosta rivin kerrallaan input#1:llä koko rivin muuttujaan ja poimin sieltä tietyt tiedot taas taulukkomuuttujaan tieto1(), sitten kun tiedosto on käyty läpi suljen Close#1 avatun tiedosto ja haen taas taulukkomuuttujasta tiedon näytölle.

Ohjelma toimii muuten ok, mutta seuraavan kerran kun hakee vaikka eri tiedoston sen tulostuminen kestää joka kerta melkein tuplasti kauemman.
olen käyttäny Erase tieto1() käskyä, eikös sen pitäisi tyhjentää tiedot.

Oli vähän vaikeesti selitetty, mutta jos joku osais neuvoja mikä siinä syö "muistia/resursseja"

edit.

Ai niin se avattava tiedosto on noin 5000 riviä ja sit muita ohjelman käyttämiä muuttuji ei sais "nollata" ainoastaan nuo tiedostosta haetut tiedot noihin taulukko muuttujiin sais pyyhkiä muistista pois aina ennen seuraavan tiedoston avausta.

Merri [22.06.2008 19:49:11]

#

Listaatko taulukkomuuttujan tiedot johonkin listauselementtiin? Jäävätkö vanhat tiedot talteen näkyville vaikka uuden tiedoston lataa? Esimerkiksi listbox hidastuu mitä enemmän siihen elementtejä laittaa, tosin sen toimintaa pystyy optimoimaan ilmoittamalla sille, miten paljon sen tarvitsee varata muistia (SendMessage List1.hWnd, LB_INITSTORAGE, 1000, ByVal 1000000 varaa 1000 elementille tilaa ja vajaan megan muistia). Oletuksena listbox varaa tilaa vain sadalle elementille eikä muistiakaan kovinkaan paljoa, sen jälkeen muistia joudutaan varaamaan aina erikseen lisää.

Milu [22.06.2008 19:57:36]

#

jos tolla listauselementti tarkoitit tota tein sen näin.

List1.Clear
Open tiedosto For Input As #1
Do While Not EOF(1)
Line Input #1, rivi
List1.AddItem rivi
rivi1 = rivi1 & rivi & vbCrLf
Loop
Close#1

Mihin toi muistinvaraus ilmoitetaa? ja miten se menee jos oiken rautalangas väännät neuvoja mulle.

Mulla ei tosiankaan ole paljoo kokemusta ohjelmoinnista joten kaikki käsitteet ei ihan ole hallussa ja ohjelman runkorakennekaan ei varmasti ole sellain kuin se pitäis olla.

Siis eka toimen pidteenä haen ne tiedot tohon list boksiin, sitten sieltä valitaan tiettyjä asioita. sen jälkeen avaan tiedoston uudestaan ja haen tietoa sieltä taulukkomuuttujiin, joka on erotettu tapulattoreilla.

kpl = 0
Open tiedosto For Input As #1
Do While Not EOF(1)
Line Input #1, rivi
tap1 = InStr(1, rivi, vbTab, vbTextCompare)
tap2 = InStr(tap1 + 1, rivi, vbTab, vbTextCompare)
tap3 = InStr(tap2 + 1, rivi, vbTab, vbTextCompare)
tap4 = InStr(tap3 + 1, rivi, vbTab, vbTextCompare)
tap5 = InStr(tap4 + 1, rivi, vbTab, vbTextCompare)
tap6 = InStr(tap5 + 1, rivi, vbTab, vbTextCompare)
t10 = Mid(rivi, 1, (InStr(1, rivi, vbTab, vbTextCompare)))
t1 = Val(Mid(rivi, tap1, tap2 - tap1))
t2 = Val(Mid(rivi, tap2, tap3 - tap2))
t3 = Val(Mid(rivi, tap3, tap4 - tap3))
t4 = val(Mid(rivi, tap4, tap5 - tap4))
t5 = Val(Mid(rivi, tap5, tap6 - tap5))
kpl = kpl + 1
tieto1(kpl) = t10
tieto2(kpl) = t1
tieto3(kpl) = t2
tieto4kpl) = t3
tieto5(kpl) = t4
t1 = 0: t2 = 0: t3 = 0: t3 = 0: t4 =0: t5 = 0: t10 = 0
Loop
Close#1

Sen jälkeen tulostan näytölle joitakin valittuja tietoja noista taulikkomuuttujista.

seuraavan kerran kun teen ton kierroksen uudella tiedostolla se aika on aina lähes tuplasti mitä edellinen.


Mod. lisäsi kooditagit

Milu [22.06.2008 21:01:26]

#

Sellaine juttu tuossa on vielä että joskus siellä tiedostossa ei olekkaan tapulaatooreiden välissä tietoa(virhe varmaan siinä ohjelmassa joka tekee ne tiedostot)niin tuo alkaa herjaama esim. tuolla rivillä
t3 = Val(Mid(rivi, tap3, tap4 - tap3))

voiko se tehdä sillein, että laittaa "on error goto loop" jolloin se jättäisi huomioimatta sen rivin kokonaan ja hakisi seuraavan rivin, entäs pitääkö nuo virheet nollata jotenkin.

Merri [22.06.2008 21:16:47]

#

Minnekäs tuo rivi1 tallentuu/mihin sitä käytetään? En näe sen määritelmää missään. Tuolla tavoin merkkijonoa kasvattaessa sen luominen hidastuu joka kerta huomattavasti sen jälkeen kun siinä on enemmän kuin ~65000 merkkiä. Tämä johtuu ihan semmoisesta seikasta, että aina kun merkkijonoja yhdistää toiseensa, niin luodaan kokonaan uusi merkkijono (ja luonnollisesti myös muistia vapautetaan kun niitä vanhoja ei enää käytetä). Voit ajatella tämän vaikka niin, että sen sijaan että kasvatat olemassa olevaa merkkijonoa, niin se hyppelee muistissa kokoajan paikasta paikkaan kasvaen jatkuvasti isommaksi samalla.

Mitä virheilmoitukseen tulee, niin laitat vaan tarkistuksen tyyliin If tap4 - tap3 > 0 Then t3 = Val(Mid(rivi, tap3, tap4 - tap3)) - noita On Error -juttuja kannattaa välttää, sen sijaan kannattaa miettiä mistä virhe johtuu, tässä tapauksessa ilmeisimmin tuon laskutoimituksen tulos antaa arvon joka on pienempi kuin 1 :)


Varmaan parempi toistaiseksi jättää tuo listbox-asia vielä sivuun, todetaan sen verran että se liittyy Windowsin API:in.

Milu [22.06.2008 21:42:30]

#

Peijooni sitä rivi1:tä ei tartte koko ohjelmassa, olen tohon ohjelmaan ottanut osia toisesta ohjelmasta copy paste tyylillä ja se on vahingossa jäännyt tähän ohjelmaan.

Kiitos paljon nyt toimii hyvin, eikä hidate sillein miten ennen.

Niin tietysti jos tuo tap:kin on nolla herjaahan se, kiitos vielä.

Milu [22.06.2008 22:03:41]

#

Nyt kun nuo on saatu korjattua löyty vielä yksi juttu jonka haluaisin saada tehtyä.

Kun siihen näytölle tulostelen niitä tietoja ne tulevat Picture1 ikkunaan ja haluaisin saada vielä pikkuisen lisää tietoa siihen ikkunaan, mutta ne tulostuvat vaakasuunnassa ikkunan "yli" eli vaakasuuntaa pitäisi saada sitä ikkunan sisältöa vieritettyä, pystysuunnassa tila kyllä on riittävästi.

Miten toi pitäisi tehdä?

Milu [23.06.2008 02:51:58]

#

Ei tartte enää,löysin haulla Antin ikkunat päälekkäin ja sillä vieritys neuvon tein sen sillein ja hyvin toimii.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta