säikeistä sekaisin?

thread?

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?

5

427

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • 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

    1. Tällä kertaa Marinia kadehtii Minäminä Päivärinta

      Kokoomuksen tyhjäntoimittelija itkeä tuhertaa, kun kansainvälinen superstaramme ei leiki hänen kanssaan. Oikean puoluee
      Maailman menoa
      422
      1816
    2. Miksi jollain jää "talvi päälle"

      Huvittaa kastoa ullkona jotain vahempaa äijää joka pukeutuu edelleen kun olisi +5 astetta lämmittä vaikka on helle keli
      Maailman menoa
      185
      1461
    3. Minua itkettää tämä tilanne

      Meidän pitäisi jutella. Eikö niin? Miehelle.
      Ikävä
      108
      1402
    4. Miksi koulut pakottavat

      Lapset uimaan sekaryhmänä? Murrosikäiset tunnetusti häpeilevät vartalossa tapahtuvia muutoksia. Tulee turhia poissaoloja
      Maailman menoa
      144
      1341
    5. Mitkä oli suurimmat

      Syyt mihin hänessä ihastuit alussa ja pikkuhiljaa tunteiden edetessä
      Ikävä
      45
      1046
    6. Suomen Pallolitto: Tasoryhmät lasten jalkapallossa - Erätauko-tilaisuus ma 20.5.2024

      Tasoryhmät lasten ja nuorten jalkapallossa herättävät paljon keskustelua. Mitä tasoryhmät ovat ja mikä on niiden tarkoit
      Suomi24 Blogi ★
      0
      970
    7. Minulla oli tunteita

      Tein itsestäni pellen. Sait hyvät naurut ja minä 💔
      Ikävä
      63
      956
    8. Mitä et hyväksy miehessä/naisessa josta olet kiinnostunut?

      Itse en halua, että miehellä olisi lapsia!
      Ikävä
      119
      913
    9. Susanne Päivärinta kirjassaan: Sannalla nousi valta päähän, Big Time!

      Päivärinta toteaa ettei ole nähnyt kenenkään muuttuvan niin totaalisesti kuin Marinin, eikä siis todellakaan parempaan s
      Maailman menoa
      93
      900
    10. Se katse silloin

      Oli hetki, jolloin katseemme kohtasivat. Oli talvi vielä. Kerta toisensa jälkeen palaan tuohon jaettuun katseeseen. Tunt
      Ikävä
      32
      886
    Aihe