Hilos en SDL con clases.

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Hilos en SDL con clases.

Notapor leonel06033 » Lun Oct 26, 2009 10:31 pm

hola amigo:

bueno, tengo una duda ahora que se cual es el problema pero no se resolverlo, voy a crear una clase que dentro de ella maneje un hilo, lo primero que me encontré es que no se me permite declarar un SDL_Thread * como miembro de una clase, tengo que hacerlo como una variable local dentro de un método, y lo otro que al utilizar la función

SDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data);

me devuelve el siguiente error

error: argument of type 'int (Cpacman::)(void*)' does not match 'int (*)(void*)'

es decir que el apuntador a la función que se espera recibir en SDL_CreateThread, no coincide con el que se le esta pasando, y claro esta función no sabe que estoy trabajando con clases, bueno la pregunta es.

como puedo hacer, para pasarle a SDL_CreateThread un metodo o función que sea de una clase, es como si tuviera que desreferenciar a la función de la clase, no se. alguien sabe como hacerlo.

espero su respuesta puesto que sin ella no podre continuar...

gracias.
Avatar de Usuario
leonel06033
 
Mensajes: 10
Registrado: Lun May 25, 2009 5:15 pm

Re: Hilos en SDL con clases.

Notapor hugoruscitti » Mar Oct 27, 2009 3:23 am

leonel06033 escribió:hola amigo:

bueno, tengo una duda ahora que se cual es el problema pero no se resolverlo, voy a crear una clase que dentro de ella maneje un hilo, lo primero que me encontré es que no se me permite declarar un SDL_Thread * como miembro de una clase, tengo que hacerlo como una variable local dentro de un método, y lo otro que al utilizar la función

SDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data);

me devuelve el siguiente error

error: argument of type 'int (Cpacman::)(void*)' does not match 'int (*)(void*)'

es decir que el apuntador a la función que se espera recibir en SDL_CreateThread, no coincide con el que se le esta pasando, y claro esta función no sabe que estoy trabajando con clases, bueno la pregunta es.

como puedo hacer, para pasarle a SDL_CreateThread un metodo o función que sea de una clase, es como si tuviera que desreferenciar a la función de la clase, no se. alguien sabe como hacerlo.

espero su respuesta puesto que sin ella no podre continuar...

gracias.


Saludos, para comenzar te comento que los métodos no se pueden
desacoplar de la clase a la que pertenecen a menos que ese método
sea un método de clase.

Si el método es de clase te puedes referir a él desde afuera
escribiendo:

Código: Seleccionar todo
NombreClase::metodo()


y la declaración del método tiene que ser algo como:

Código: Seleccionar todo
class NombreClase
{
    public:
        static void metodo(void)
        {
            ...


es decir, es muy importante utilizar la palabra "static" en la declaración,
porque no es un método que se aplicará sobre una instancia sino sobre
la misma clase...


En fin, para relacionarlo un poco con hilos de SDL armé un ejemplo
muy sencillo que muestra como lanzar un hilo con SDL que ejecuta
un método de clase:


makefile:
Código: Seleccionar todo
CPPFLAGS = `sdl-config --cflags` -Wall
LDFLAGS = `sdl-config --libs`
CC = g++

test: test.o


test.c
Código: Seleccionar todo
#include "SDL/SDL.h"

class Ejemplo
{
    public:

        static int correr_en_hilo(void * data) {
            printf("Soy el proceso hilo iniciando.\n");
            printf("Soy el proceso hilo esperando 2 segundos.\n");
            SDL_Delay(2000);
            printf("Soy el proceso hilo terminando.\n");
            return NULL;
        }


        void wait(void) {
            SDL_Delay(3 * 1000);
        }
};

int main (void)
{
    Ejemplo ejemplo;
    SDL_Thread * handle;

    SDL_Init(0);


    // inicio un hilo:
    handle = SDL_CreateThread(Ejemplo::correr_en_hilo, NULL);

    printf("Soy el programa principal y espero 1 segundos.\n");
    SDL_Delay(1 * 1000);


    printf("Soy el programa principal y espero a que termine el hilo.\n");
    SDL_WaitThread(handle, NULL);

    return 0;
}


resultado en pantalla:
Código: Seleccionar todo
Soy el proceso hilo iniciando.
Soy el proceso hilo esperando 2 segundos.
Soy el programa principal y espero 1 segundos.
Soy el programa principal y espero a que termine el hilo.
Soy el proceso hilo terminando.




PD: hacer aplicaciones con hilos suele traer varias dificultades
asociadas con la sincronización y la memoria compartida, ¿realmente
necesitas que la aplicación use hilos?.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

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