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

526

    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. Medvedev: Suomi tuhoutuu ydinsodassa ensimmäisenä

      Venäjän ydinaseilla on lyhyin matka Suomeen, joten ydinsodassa Suomi tuhoutuu heti sodan alkuminuuteilla, muilla mailla
      Maailman menoa
      616
      2320
    2. Hotellille löytyi ostaja....

      Tämän päivän Kainuun Sanomissa oli uutinen, että pesänhoitajan mukaan Hotelli Kainuu myydään ensiviikolla. Hieno homma,
      Kuhmo
      27
      1156
    3. Sinä. Just sinä.

      Palataan ajassa taaksepäin vuosi tai kaksi. Mitä tekisit toisin jos voisit?
      Ikävä
      109
      1128
    4. Saana airola ja. muusikko spekulaatiota

      Saara airolan kirja muusikko mies. Oisko redrama tai lauri tähkä? Saana oli 13 v vuonna 2014 Tekoäly sanoo : tähkä Julki
      Yhteiskunta
      8
      992
    5. Miten kuvaisit tunteitasi

      tällä hetkellä?
      Ikävä
      91
      893
    6. Onko se loukkaavaa

      Kun joka kerta tuijotan sun peppua. En mahda sille mitään, että se vangitsee katseeni. Pohdin vain että ei minusta ole k
      Ikävä
      101
      875
    7. Jos saisit palata takaisin johonkin vuoteen

      Mikä vuosi se olisi? Ja mitä siinä hetkessä tapahtuisi?
      Ikävä
      91
      777
    8. Onko kaivattusi seinäruusu?

      Kun hän saapuu paikalle, huomaako kukaan, vai kääntyvätkö päät? Onko se hyvä vai huono juttu? Oletko sinä huomattu vai
      Ikävä
      50
      759
    9. Tiedätkö kaivattusi musiikkimaun?

      Minkälaisesta musiikista hän pitää?
      Ikävä
      64
      731
    10. Moi, olen Lampunhenki

      Kerro toivomuksesi🏺
      Ikävä
      66
      587
    Aihe