SDL:n CreateThread funktion esittely:
SDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data);
Esimerkkiluokka:
class Luokka { SDL_Thread *thread; int Initialize(); int ThreadFunction(void *unused); }; int Luokka::ThreadFunction(void *unused) { // Kaiken näköistä return 0; } int Luokka::Initialize() { thread = SDL_CreateThread(ThreadFunction, NULL); // Ei onnistu return 0; }
"Ei onnistu"-rivillä valittaa tällaista:
argument of type `int (Luokka::)(void*)' does not match `int (*)(void*)'
Pystyykö asian korjaamaan ilman, että irrottaa ThreadFunctionia luokasta? Ei ole kovin kiva välittää funktiolle kaikkia tarpeellisia tietoja yhden parametrin kautta. Lisäksi systeemi kadottaa loogisuuden ja c-tyyli sopisi paremmin.
Luokkien jäsenfunktioita ei voi välittää eteenpäin tuolla tavalla ellei niitä ole määritelty staattisiksi, ja silloin taas ei voi käyttää luokan jäsenmuuttujia. Joudut siis tekemään sellaisen ratkaisun, jossa kutsuttavassa funktiossa tunnistat, mikä thread on kyseessä. Aivan luokan ulkopuolinen funktio siis käytännössä, ja sieltä pitää kutsua oikean Luokan edustajan funktioita. Varmaankin tunnistaminen menee tuon datapointterin avulla, mutta en ole SDL:n säikeisiin perehtynyt.
class Luokka { int Lopullinen_ThreadFunction(void* /*Laita vastaanottamaan mitä haluat*/) //Huomaa Static määre static int ThreadFuntion(void* unused) }; int Luokka::ThreadFuntion(void* unused) { Luokka* OsoitinLuokkaan = (Luokka*)unused; OsoitinLuokkaan->Lopullinen_TreadCuntion(NULL /*Lähetä mitä haluat*/); }
Säije luodaan esimerkiksi näin...
Luokka* OlioLuokasta; OlioLuokasta = new Luokka(); SDL_CreateThread(Luokka::ThreadFuntion, (void*)OlioLuokasta)
Vautsi! On kyllä pientä kikkailun makua, mutta on se sen arvoista saada kaikki samaan luokkaan :)
Toimii hienosti, kiitos!
noh, sitä varten se pointeri siellä ThreadFunction:ssa on
Tuolla on myös melkoinen kasa eri tapoja threadien käyttöön: http://www.codeproject.com/threads/
Aihe on jo aika vanha, joten et voi enää vastata siihen.