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

431

    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. Tykkään sinusta tosi tosi paljon

      Siksi en pysty sisäistämään sitä, että se ei ole molemminpuolista. Sattuu liikaa. En osaa käsitellä sitä tunnetta, koska
      Ikävä
      51
      3467
    2. Mikä sai sut ihastumaan

      Mitä tapahtui?
      Ikävä
      156
      2099
    3. Kaupan kassalla kannataa olla kylmä käytös

      https://www.is.fi/taloussanomat/art-2000010488540.html "19-vuotias Minja ja 59-vuotias Anne työskentelevät sillä todelli
      Sinkut
      204
      1791
    4. Mitä tehdä asialle?

      Jos laitan deitti-ilmon "40-vuotias nainen etsii seuraa" niin ketään ei kiinnosta (korkeintaan paria runkkaripenaa joill
      Sinkut
      135
      1699
    5. 80
      1165
    6. Hyvää heinäkuuta

      Hyvää huomenta ihanaa. 🦗🌾☔🤗🌻❤️
      Ikävä
      234
      1104
    7. Mitä helvettiä pakolaisille pitäisi tehdä RAJALLA?

      Jos Venäjä työntää rajalle pakolaisia ja tekee Suomelle selväksi että heidän puolelleen ei ole pakolaisilla asiaa - mitä
      Maailman menoa
      273
      1045
    8. Ethän syytä itseäsi

      siitä miten asia menivät. Mä en antanut sulle tilaisuutta.
      Ikävä
      130
      999
    9. Olen pahoillani mies

      Olen surullinen puolestasi, ettet saanut kaipaamaasi naista. Yrititkö lopulta edes? Teistä olisi tullut hyvä pari
      Ikävä
      52
      929
    10. Olet mies varmasti peto

      Makkarin puolella. 🤤
      Ikävä
      72
      895
    Aihe