Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Funktiopointteri ja luokka

Gaxx [17.04.2006 18:48:58]

#

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.

Metabolix [17.04.2006 21:47:26]

#

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.

WinC [17.04.2006 22:01:19]

#

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)

Gaxx [17.04.2006 22:27:15]

#

Vautsi! On kyllä pientä kikkailun makua, mutta on se sen arvoista saada kaikki samaan luokkaan :)

Toimii hienosti, kiitos!

phadej [17.04.2006 22:39:47]

#

noh, sitä varten se pointeri siellä ThreadFunction:ssa on

rutkis [26.04.2006 13:40:37]

#

Tuolla on myös melkoinen kasa eri tapoja threadien käyttöön: http://www.codeproject.com/threads/

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta