Miten saadaan c :ssa kaksi silmukkaa pyörimään jatkuvasti mutta yhtä aikaa! eli yksi silmukka poimii kokoajan tavaraa muuttujien sisälle puskurista, toinen silmukka samaan aikaan etsiin tietoa koneelta ja kun löytää sen poimii muuttujaan tulleen tavaran sen siellä olo ajan perusteella ja tekee sitten tälle jotain.. !
how? oisko vinkkejä?
how? oisko vinkkejä?
Vastaukset 9
Vanhimmat
Javalla on ainakin suht yksinkertaista saada pari threadia pyörimään "yhtäaikaa", uskoisin että C :ssa löytyy myös säikeiden käsittelyyn kikkoja. Mutta jos useampi säie käpistelee yhteisiä muuttujia, niin on erittäinkin helppoa saada oma ohjelmansa sekaisin ("puskuri" on tyhjä, tai samaa muuttujan arvoa luetaan useampaan kertaan..)
Koodaapa samalla muutamat semaforit mukaan.
ei kukaan osais näyttää jotain semierrkiä tai jotain.. oon nimittäin aikas hukas tän kans.. pitäs saada pelittään!
Netti on aika kattava hakuteos, eli sieltä löytyy säikeiden käsittelyyn vaikka mitä
www.google.com ja threat c hakusanoiks, niin eiköhän onnistu
http://world.std.com/~jimf/papers/c sync/c sync.html
Ihmettelen vaan sitä mitä tarkotat "kahdella silmukalla jotka pyörivät YHTÄ AIKAA".
Eihän esim. samaan aikaa voida kutsua kahta eri funktiota tai luoda yhtä aikaa kaksi eri muuttujaa.
No, se löpinöistä. Ehkä se jotenkin näin menis..
DWORD *Aika;
int *Muuttuja;
int MuuttujienMaara = 0;
while(1)
{
MuuttujienMaara
Muuttuja[MuuttujienMaara] = TyhjennaPuskuri();
Aika[MuuttujienMaara] = ?; // tähän funktio joka palauttaa kuluneen ajan millisekunteina siitä lähtien kun windows käynniestettiin, en tosin muista nimeä
If(EtsiTietoa() == true)
PoimiTieto(Muuttuja, Aika);
}
void PoimiTieto(int Muuttuja, DWORD Aika)
{
for(int i = 0; i = MuuttujienMaara; i )
{
if(Aika[i] == ?)
TeeMuuttajalleJotain(Muuttuja[i]);
}
}
Tässä nyt vähän suuntaa antava, millaisena sen näkisin. Huomatkaa että se on keskeneräinen.
eikö C :ssa oo mitään säikeitä vastaavaa? kyllähän "moniajoa" pystyy tekemään...
OK... eli kuten miig sanoi "...säikeet" ehdottaisin minäkin niiden käyttöä, jos ohjelma todella sitä tarvitsee...
Mikäli tarvitset lisää infoa säikeistä niin "klikkaa help" tai kysy... varmaan moni täällä tietää kertoa, jotain pientä.
No, kertokaa joku lyhyesti mitä säikeet ovat?
Karkeasti ohjelman (prosessin) luoma "aliprosessi".
Esim. sorttaus, pääohjelma luo ikkunan ja piirtää tilanteen näkyviin sekä luo 3 säiettä, kupla-, quick- ja heap-sorteille. Jokainen säie suorittaa omaa lajitteluaan ja "ilmoittaa" pääohjelmalle tilaanteesta. Säikeet suoritetaan "samanaikaisesti" (tosin 1 prosujärjestelmässä vuorotellen). Kun yksi säie saa hommansa valmiiksi, muut jatkavat jne. Ei vähän sama kuin jakaisit kolmelle kaverillesi saman listan aakkostettavaksi. Jokainen väsää omiaan ja ilmoittaa homman sinulle. Tai jotain. Toivottavasti selkesi.
Edellä kehotettiin ajamaan luuppeja eri säikeiden alla, mikä on aivan kelpo neuvo joissakin tapauksissa. Lähtökohta täytyy kuitenkin olla se, että yrität "sieventää ongelmasi" siten, että voit tehdä yhdellä luupilla mainitsemasi kaksi asiaa, siis:
do {
if (PuskurissaTavaraa()) {
/* Poimi muuttujaan */
....
}
if (EtsiTietoaOk()) {
/* Ota muuttujasta ja tee sille joitain */
....
}
} while (....);
Tiettyyn pisteeseen saakka tämä on helpompi tapa. Säikeitä käytettäessä on huolehdittava synkronoinnista ja datan (jne.) lukuun ja kirjoitukseen liittyvistä seikoista. Säikeet hieman hankaloittavat myös koodin debuggausta.