Olen tekemässä ohjelmaa, minkä pitäisi osata lukea tiedostoa, eikä ihan mitätahansa pikkutiedostoa, vaan valtavaa luetteloa, missä on noin 60'000 riviä... On selvää että ohjelman pitää osata jotenkin rajata luetteloa, sellaisenaan sen selailu ei ole kovin mielekästä.
Tiedoston koko on sitä luokkaa, että se on pakko lukea ensin muistiin, mikään levyasema ei ole tarpeeksi nopea sujuvaan käyttöön. Tämä kuitenkin aiheuttaa pienen ongelman, nimittäin tiedoston lataamisen ajan ohjelma itsessään on täysin jumissa. Ratkaisu on periaatteessa melko yksinkertainen, siirsin tiedoston käsittelyn erilliseen "säikeeseen", jolloin ohjelman muut osat toimivat.
Tuo onnistuikin ihan hyvin, ja innostuin siitä niin, että siirsin luetteloa käsittelevänkin osan omalle säikeelleen, mutta se ei onnistunutkaan ihan niin mukavasti. Luettelon käsittelijän pitäisi tulostaa datagridille tietty osa luettelosta... Se "käsittelijä" oli jo olemassa oleva subi, ja ihan toimiva sellainen, mitä nyt jumiutti ohjelman siksi aikaa kun kävi luetteloa läpi... subin ajaminen omassa säikeessä poisti kyllä jumiutumis ongelman, mutta toi tilalle uuden, nyt datagridin scrolbar ei toimi ihan niinkuin pitäisi, vaan siinä esiintyy kummallisia häiriöitä, välillä se ei näy ollenkaan, ja toisinaan sen tilalla näkyy vain vaaleanharmaa alue, ja välillä se näkyy normaalisti, mutta ei tee yhtään mitään. Rullalla vierittäminen kuitenkin onnistuu ihan normaalisti.
Mistäköhän tuo voisi johtua? Ja onko kenelläkään mitään ajatusta kuinka tuon saisi toimimaan?
säikeistä sekaisin?
5
447
Vastaukset
- on periaatteessa
hieman ongelmaa. Nimittäin jos ajat tiedoston lukua ja käsittelyä erillisessä säikeessä niin (en nyt tiedä ympäristöäsi) niin mekanismit jotka suojaavat säikeitä toisiltaan aiheuttavat ogelmia. Ihme että pääset noinkin vapaasti tiedostoa käpistelemään.
Ei 60 000 riviä nyt niin hirveästi ole,
pitäisi kyllä muutamassa sekunnissa latautua, ilmeisesti teet joitain operaarioita luvun yhteydessä?
Lue "raakana" muistiin ja ala sitten prosessoida.- thread?
"Nimittäin jos ajat tiedoston lukua ja käsittelyä erillisessä säikeessä niin (en nyt tiedä ympäristöäsi) niin mekanismit jotka suojaavat säikeitä toisiltaan aiheuttavat ogelmia."
Siis tarkennettakoot sen verran, että lukua ja käsittelyä ei suoriteta samaan aikaan, vaan tiedot luetaan ensin muistiin. Ja vasta sitten niitä voidaan käsitellä.
"Ei 60 000 riviä nyt niin hirveästi ole,
pitäisi kyllä muutamassa sekunnissa latautua, ilmeisesti teet joitain operaarioita luvun yhteydessä?
Lue "raakana" muistiin ja ala sitten prosessoida."
En tiedä tarkkaan mitä tarkoitat "prosessoimisella"... Tiedot ladataan kyllä muutamaan eri muuttujaan. Mutta siinäkin auttaa se, että sarakkeet ovat vakiomittaisia, eli ei tarvitse esim. etsiä jotain välimerkkejä tms. vaan luen vaan riviltä tietyn määrän merkkejä yhteen muuttujaan, ja sitten tietyn määrän toiseen jne.
Ja ihan yhteen muuttujaan niitä ei voisikaan ladata, sillä luettelo on kahdessa eri tiedostossa. Ja sitten jos tiedostot luettaisiinkin "raakana" muistiin, niin sitten pitäisi vielä poimia sen raakadatan seasta ne tarvittavat tiedot, ja siihen menisi taas aikaa.
Mainittakoot, että tiedostojen yhteenlaskettu koko on melkein 14 megaa. Ja eihän se lukuaika niin hirveän pitkä olekaan, eniten se häiritsee kun itse koodailee, ja yhtä nappulaa kokeillakseen täytyy odotella kun ohjelma lataa luetteloa... Todennäköisesti tavallinen käyttäjä pystyisi elämään sen käynnistysviiveen kanssa ihan hyvin.
Ja taisin muuten unohtaa mainita että koodailen VB .NETillä.
- Java
Vastaan Java pohjalta ihan mutuna. Kun puhutaan säikeistä, niin silloin keskeinen käsite on ns. synkronointi. Tällä tarkoitetaan sitä että jotenkin pitää ottaa huomioon myös ne tilanteet mitä siitä seuraa kun useampi säie käsittelee samanaikaisesti samaa objektia/komponenttia. Käyttöliittymän komponentteja ei yleensä saa käsitellä useasta säikeestä yhtä aikaa, koska niissä ei ole huomioitu synkronointia, koska se olisi usein hankalaa ja turhaa
Käyttöliittymän päivitys ongelma johtuu siis siitä että sinun uusi säikeesi muuttaa käyttöliittymää samaan aikaan kun käyttöliittymän säie on päivittämässä ruudun sisältöä. Yleensä nämä säikeisiin liittyvät synkronointi ongelmat ilmenevät juuri kuvailemallasi satunnaisena käytöksenä.
Pitkää prosessointi/laskenta aikaa vaativat jutut hoidetaan yleensä siten että erillinen laskenta säie tekee tehtävänsä muistiin, jonka jälkeen (tai tasaisin väliajoin) kyseinen säie käynnistää ns. päivitys koodin joka ajetaan käyttöliittymän säikeestä ja jonka tehtävä on päivittää käyttöliittymän komponentit. Esimerkiksi Javassa on käskyt InvokeLater() ja InvokeAndWait() joilla toinen säie voi pakottaa ajamaan jotakin koodia käyttöliittymän säikeessä.
En tiedä saitko selvää, mutta äkkiä googlettettuna seuraavista linkeistä voisi olla asiaan liittyvää tietoa (VB:n vinkkelistä):
http://msdn.microsoft.com/msdnmag/issues/04/05/BasicInstincts/default.aspx
http://www.microsoft.com/indonesia/msdn/threadinginvb2005.aspx
http://samples.gotdotnet.com/quickstart/howto/doc/WinForms/WinFormsThreadMarshalling.aspx- thread?
"Käyttöliittymän päivitys ongelma johtuu siis siitä että sinun uusi säikeesi muuttaa käyttöliittymää samaan aikaan kun käyttöliittymän säie on päivittämässä ruudun sisältöä. Yleensä nämä säikeisiin liittyvät synkronointi ongelmat ilmenevät juuri kuvailemallasi satunnaisena käytöksenä.
Pitkää prosessointi/laskenta aikaa vaativat jutut hoidetaan yleensä siten että erillinen laskenta säie tekee tehtävänsä muistiin, jonka jälkeen (tai tasaisin väliajoin) kyseinen säie käynnistää ns. päivitys koodin joka ajetaan käyttöliittymän säikeestä ja jonka tehtävä on päivittää käyttöliittymän komponentit. Esimerkiksi Javassa on käskyt InvokeLater() ja InvokeAndWait() joilla toinen säie voi pakottaa ajamaan jotakin koodia käyttöliittymän säikeessä. "
Hmm... Voisikohan koko taulukon poistaa näkyvistä?
tarkoitan, että datatablen voisi varmaan ottaa pois näkyvistä, ladata siihen kaikki tarpeellinen, ja palauttaa näkyviin kun lataaminen on ohi... Ja tässä kohtaa on huomattava, että datatable ei ole sama kuin datagrid. Ymmärtääkseni se scrolbar liittyy nimenomaan datagridiin, ja datatable on vain tietoja sisältävä taulukko.
Ongelma on siinä etten tiedä miten datagridin näkymää voidaan muutella ohjelmallisesti.
Tutkin asiaa.
- thread?
Tutkin asiaa hieman... Ja sain kuin sainkin määriteltyä datagridin näyttämän taulun ohjelmallisesti, eli ajon aikana.
Ennen tietoja käsittelevän säikeen ajamista määrittelin datagridin näyttämään tyhjää, ja sitten säikeen loputtua palautin sen taulukon takaisin.
Ladatessa ruutuun koko luettelo esiintyi vielä joku pieni bugi, mutta eiköhän tuokin vielä korjaannu...
Kiitokset auttajille.
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Miehille kysymys
Onko näin, että jos miestä kiinnostaa tarpeeksi niin hän kyllä ottaa vaikka riskin pakeista ja osoittaa sen kiinnostukse1343879- 851905
Olen tosi outo....
Päättelen palstajuttujen perusteella mitä mieltä minun kaipauksen kohde minusta on. Joskus kuvittelen tänne selkeitä tap151771Haluaisin jo
Myöntää nämä tunteet sinulle face to face. En uskalla vain nolata itseäni enää. Enkä pysty elämäänkin näiden kanssa jos541412Kotkalainen Demari Riku Pirinen vangittu Saksassa lapsipornosta
https://www.kymensanomat.fi/paikalliset/8081054 Kotkalainen Demari Riku Pirinen vangittu Saksassa lapsipornon hallussapi461337Ylen uutiset Haapaveden yt:stä.
Olipas kamalaa luettavaa kaupungin irtisanomisista. Työttömiä lisää 10 tai enempikin( Mieluskylän opettajat). Muuttavat1301323VENÄJÄ muuttanut tänään ydinasetroktiinia
Venäjän presidentti Vladimir Putin hyväksyi tiistaina päivitetyn ydinasedoktriinin, kertoo uutistoimisto Reuters. Sen mu991280- 701166
- 691033
Hommaatko kinkkua jouluksi?
Itse tein pakastimeen n. 3Kg:n murekkeen sienillä ja juustokuorrutuksella. Voihan se olla, että jonkun pienen, valmiin k1131022