Toon posts:

[C++] SDL - thread in object wil niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallow,

Ik heb een probleem; ik probeer een tetris kloon te maken met C++ en SDL (simple directmedia layer). Het volgende stukje code compileert perfect:
C++:
1
2
3
4
5
6
7
int framethread(void *bla) { while (true) {  } return 0; } //de inhoud doet er nu even niet toe

void start() {
       bool running = true;
       SDL_Thread *ft = SDL_CreateThread(framethread,NULL);
       while (running) { }  
}

SDL heeft een ingebouwde functie om threads te laten lopen.

Als ik echter dezelfde functies in een object zet, wil het niet meer compileren:

C++:
1
2
3
4
5
6
7
8
9
class klasse1 {
   int framethread(void *bla) { while (true) { } return 0; } //de inhoud doet er nu even niet toe
public:
   void start() {
       bool running = true;
       SDL_Thread *ft = SDL_CreateThread(framethread,NULL);
       while (running) { }  
   }
}

VC++ 6.0 geeft dan volgende error:
code:
1
2
C:\tetris\cpp1.cpp(65) : error C2664: 'SDL_CreateThread' : cannot convert parameter 1 from 'int (void *)' to 'int (__cdecl *)(void *)'
        None of the functions with this name in scope match the target type

ik snap niet waar dit aan ligt, aangezien de thread dezelfde functie is, alleen dan als member van een object?
(let er maar niet op dat er nu twee oneindige threads bezig zijn, want dit is normaal natuurlijk niet het geval :P)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je framethread methode heeft een object nodig om aangeroepen te worden, je kunt het niet als losse functie gebruiken. SDL_CreateThread heeft echter wel een losse functie nodig om aan te kunnen roepen. Je zult die methode dus static moeten maken, of gewoon buiten de klasse moeten declareren (cursus C++ is wellicht wel handig ;))

[ Voor 7% gewijzigd door .oisyn op 15-06-2004 16:24 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Als je toch graag die methode van het object wilt aanroepen, dan zou je het volgende kunnen doen:
Static methode in de klasse die je meegeeft aan CreateThread. Verder geef je als tweede parameter van die CreateThread het object zelf mee (this). Wat jij als tweede parameter meegeeft wordt na het creëren van de thread als eerste parameter aan jouw static functie meegegeven. Deze eerste parameter (die void*) kan je dus casten naar een pointer naar je object en dan kan je de methode aanroepen...

[ Voor 19% gewijzigd door Infinitive op 15-06-2004 16:28 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]