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

464

    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. Janne Ahonen E R O A A

      Taas 2 lasta jää vaille ehjää perhettä!
      Kotimaiset julkkisjuorut
      148
      2639
    2. En kai koskaan saa sinua

      Koska et usko että riitäisit minulle. Olet aina pitänyt itseäsi liian risana ja heikkona. Katkot korkeutesi, ja poraat k
      Ikävä
      154
      1669
    3. Terveystalon lääkärit ylilaskuttaneet

      Tämän pörriäiset osaavat, laskuttamisen. Terveystalo myöntää asian. https://www.hs.fi/suomi/art-2000011134269.html "K
      Maailman menoa
      134
      1634
    4. Saran ökytyyli käänsi katseita.

      On nyt kyllä Sara kasvoistaan, kuvan perusteella todellakin pyöristynyt ainakin kuvan perusteella.
      Kotimaiset julkkisjuorut
      150
      1381
    5. Nyt on aika laittaa parit selkoon.

      Onko pareja täällä. Laita kirjaimet kuka tykkää kenestäkin ?
      Ikävä
      66
      1338
    6. The Summit Suomi: Maxie avaa hyytävästä tilanteesta kuvauksissa: "Veri roiskui ja tajusi, että..."

      Oletko seurannut The Summit Suomea? Tykkäätkö vai et tai mitä mieltä ylipäätään olet sarjasta? Moni katsoja on kaikonnut
      Tv-sarjat
      13
      1190
    7. Työttömille lusmuille luvassa lisää keppiä

      Hallitus aikoo kiristää velvoitteiden laiminlyönnistä seuraavia työttömyysturvan karensseja ensi vuodesta alkaen. Hall
      Maailman menoa
      285
      1183
    8. Ootko huomannut miten

      pursuat joka puolelta. Sille joka luulee itsestään liikoja 🫵🙋🏻‍♂️
      Ikävä
      156
      986
    9. Miksi ihmeessä?

      Erika Vikman diskattiin, ei osallistu Euroviisuihin – tilalle Gettomasa ja paluun tekevä Cheek
      Ateismi
      24
      940
    10. Tiedän kaiken sinusta ja kaikesta

      Tiedän miten kärsit. Tiedän millanen oikeesti oot. Tiedän miksi valehtelit, tiedän miksi satutit mua. Tiedän mitä tapaht
      Ikävä
      58
      899
    Aihe