Eli olen nyt saanut oman projektini alkua pidemmälle ja nyt olen miettinyt, miten toteutan seuraavan osan ohjelmasta, eli tulin siihen tulokseen, että pitäisi olla säie, joka lukee tulevaa dataa ohjelmassani. Ongelmana on vain, miten tällainen säie luodaan? Käytän projektissani tällä hetkellä SDL, SDL_net lisäkirjastoja.
Olisi myös hyvä, jos saisin pienen esimerkin säikeiden käytöstä
Ensin kannattaa miettiä, voisiko asian toteuttaa jotenkin muuten. Säie on harvoin ainoa tai edes hyvä ratkaisu. (Jos ongelmanasi on, että SDLNet pysäyttää ohjelman, kunnes dataa saadaan luettua, tutustu funktioihin SDLNet_CheckSockets ja SDLNet_SocketReady sekä niiden tarvitsemaan SDLNet_SocketSet-rakenteeseen.)
Jos olet aivan varma, että säikeet ovat ratkaisusi, niille on tuki SDL:ssä. Niiden kanssa pitää kuitenkin olla hyvin tarkkana, jottei missään tilanteessa käy niin, että ohjelman eri säikeet yrittävät käyttää samaa dataa samoihin aikoihin.
Noniin, kiitoksia tiedosta Metabolix ja sainkin johdettua omasta ongelmastani vaihtoehdon, eli kehitän systeemin cin olion tilalle, eli luen joka loopin kieroksella näppäinten painallukset ja kirjaan tuloksen string tyyppiseen muuttujaan, mikä sitten lähetetään enteriä painettaessa. Tällöin lukeminen ei siis pysäytä ohjelman lukua ja on uskoakseni helpompi luoda tekstinkirjoitus itse graafiseen versioon ohjelmasta.
Itse kyllä rohkaisisin pikemminkin käyttämään säikeitä; miksi ei? Boost tarjoaa erittäin viimeistellyn ja kattavan kirjaston säikeiden käyttöön ja RAII varmistaa sen, että mutexit ja semaphoret vapautuvat automaattisesti.
class TestThread { public: Thread() : _stoprequested(false) , _thread(boost::bind(&Thread::DoWork, this)) { } ~Thread() { _stoprequested = true; _thread.join(); } int GetValue(int which) { boost::mutex::scoped_lock l(m_mutex); return _values.at(which); } private: void DoWork() { boost::xtime xt; unsigned int i = 0; while (!_stopRequested) { boost::xtime_get(&xt, boost::TIME_UTC); xt.sec += 1; boost::thread::sleep(xt); { boost::mutex::scoped_lock l(m_mutex); _values.push_back(i++); } if (i > 4) { _stopRequested = true; } } } private: volatile bool _stoprequested; std::vector<int> _values; boost::mutex _mutex; boost::thread _thread; };
Aihe on jo aika vanha, joten et voi enää vastata siihen.