Problema con Threads en libreria SDL en C++

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Problema con Threads en libreria SDL en C++

Notapor El_Guille » Vie Abr 01, 2011 9:55 pm

Hola soy nuevo en el foro, abri este tema por que tengo una duda acerca de los Thread que vienen en la libreria sdl, el problema no es tanto por la sintaxis si no que cuando quiero hacer que un hilo llame el metodo de una clase no me deja compilar. aqui esta un ejemplo de como mas o menos quiero que sea:

#include <stdio.h>
#include <stdlib.h>;
#include <SDL/SDL.h>
using namespace std;
class clase{
public : clase(){
SDL_Thread *hilo;
//hilo=SDL_CreateThread(run,NULL);
}

public :int run(void *data){
while(1>0)metodo();
return 0;
}

public :void metodo(){}
};
int main(int argc, char *argv[]){}

¿por que lo quiero asi?
Por que quiero hacer un juego y ese hilo corresponde al del personaje que voy a usar para los procesos de validacion/movimiento y repintado, por eso necesito llamar a metodos de una clase pero no me deja hacer eso,ni siquiera me deja que el metodo run este dentro de una clase, asi que necesito su ayuda por favor
Saludos
El_Guille
 
Mensajes: 6
Registrado: Vie Abr 01, 2011 9:52 pm

Re: Problema con Threads en libreria SDL en C++

Notapor carlostex » Sab Abr 02, 2011 6:13 am

Si no me equivoco sdl no te permite llamar a funciones definidas dentro de una clase para crear procesos, esto es por que sdl esta programado completamente en c.
pero hay solución usa boost entra a su pagina y averigua hay algunos ejemplos.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Problema con Threads en libreria SDL en C++

Notapor El_Guille » Sab Abr 02, 2011 4:33 pm

mmm.... ya veo, ¿alguna sugerencia para crear hilos de esa manera? ¿alguna libreria de hilos basada en c++?
El_Guille
 
Mensajes: 6
Registrado: Vie Abr 01, 2011 9:52 pm

Re: Problema con Threads en libreria SDL en C++

Notapor Mightygaver » Sab Abr 02, 2011 5:02 pm

Tengo C++ poco fresco y menos SDL, pero voy a tratar de ayudarte.

En C++ si no me equivoco los métodos de una clase no son exactamente lo mismo que una función definida fuera de una clase.

SDL_CreateThread espera una función definida fuera de una clase, no un método. Como carlostex te ha comentado, la librería boost tiene funciones que no recuerdo bien pero que trabajan con los punteros a función para hacer su manipulación más agradable, por lo que puede que por ahí te vaya bien, pero sinceramente yo te recomiendo que primero calles al compilador con algo así.

int run(void * data)
{
//código de prueba, por ejemplo un printf
return 0;
}

SDL_Thread * th = SDL_CreateThread(run,NULL);


Si ves que va, pues prueba con funciones estáticas dentro de la clase, que creo que funcionan como las otras, o buscas en la docu de boost la función que menciona carlostex.

Suerte!

PD: Me ha venido de perlas para probar la tag codigo :D
Mightygaver
 
Mensajes: 69
Registrado: Vie Ago 27, 2010 5:46 pm
Ubicación: Vila-real, España

Re: Problema con Threads en libreria SDL en C++

Notapor carlostex » Sab Abr 02, 2011 5:28 pm

Intenta lo que dice Mightygaver, aunque no estoy seguro que funcione si tienes que escribir algo como clase::función no va a funcionar por que eso no existe en C, si lo quieres hacer con hilos en C++ boost es una buena opción, ahora no recuerdo como y ni se si lo use, investigar sobre el tema ya es lo que te toca a ti.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Problema con Threads en libreria SDL en C++

Notapor Geo » Jue Abr 21, 2011 10:28 pm

No pusiste el mensaje de error del compilador, podría ayudar :).

SDL_CreateThread espera una función estática, para poder pasarle una función miembro de una clase ésta debe ser estática, en tu caso sería algo como esto:

static int run_static( void* data )

El problema, es que las funciones miembro estáticas no pueden acceder a variables ni funciones miembro no estáticas. Si en tu código te sirve trabajar así, con esto basta.
Sin embargo, lo más probable es que desees acceder a variables miembro no estáticas, en tal caso lo que he hecho es usar dos funciones, una estática que se pasa como parámetro a SDL_CreateThread que devuelve un puntero a una segunda función no estática en la que se ejecuta el código del hilo, así:

Código: Seleccionar todo
class Clase
{
   Clase()
   {
      hilo = SDL_CreateThread( &static_run, this );
   }

   static int static_run( void* param )
   {
      return ( ( Clase* )param )->run();
   }

   int run()
   {
      while( condicion )
      {
         // código
      }
   
      return 0;
   }
}

Al llamar a SDL_CreateThread se le pasa la función estática Clase::static_run y un puntero a la clase como parámetro, la función devuelve un puntero a la función no estática run, en la que se ejecuta el código deseado, el problema con esta forma es que no le paso parámetros a la función run(), pero en mi caso me ha funcionado perfecto.
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado