Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Multithreading En SDL

Iniciado por phantom, 05 de Diciembre de 2006, 11:55:20 PM

« anterior - próximo »

phantom

Hola, uso SDL 1.2.11, CodeBlocks y copmilo con el GCC.

El caso es este, hasta hace tiempo estuve haciendo algunas clases para simplifacar el Multithreading via SDL en mi lib, pero no consigo mucho :S...

Aqui el codigo:
(el codigo fue escrito por Lucas Tavolaro Ortiz, a.k.a Tavo, antiguo colaborador al motor, pero ahora que se fue, estoy yo a cargo de esto tambien y le hice algunas modificaciones [NUNCA funciono esta parte])
Código:
PhantomSDL_CMULTITHREADING *PhantomSDL_CMULTITHREADING::mInstance = 0;

PhantomSDL_CMULTITHREADING::PhantomSDL_CMULTITHREADING()
   {
   mLog = PhantomSDL_CLOG::getInstance();
   mLog->write(2,"[CMultiThreading]-> Singleton Created.");
   }

PhantomSDL_CMULTITHREADING::~PhantomSDL_CMULTITHREADING()
   {
   mLog->write(2,"[CMultiThreading]-> Singleton Destroyed.");
   PhantomSDL_CMULTITHREADING::waitAllThreads();
   PhantomSDL_CMULTITHREADING::killAllThreads();
   }

PhantomSDL_CMULTITHREADING* PhantomSDL_CMULTITHREADING::getInstance()
   {
   if ( PhantomSDL_CMULTITHREADING::mInstance == 0 )
       {
       mInstance = new PhantomSDL_CMULTITHREADING;
       }
   return mInstance;
   }

void PhantomSDL_CMULTITHREADING::erase()
   {
   if( PhantomSDL_CMULTITHREADING::mInstance != 0)
       {
       delete mInstance;
       }
   }

void PhantomSDL_CMULTITHREADING::addThread(int (*THREADName)(void*), void* THREADData)
   {
   mThreads.push_back(SDL_CreateThread(THREADName, THREADData));
   mLog->write(2,"[CMultiThreading]-> added a Thread with the following name: %s & data: %s",THREADName, THREADData);
   }

void PhantomSDL_CMULTITHREADING::deleteThread(SDL_Thread* THREADName)
   {
   if(mThreads.empty())
       {
       mLog->write(2,"[CMultiThreading]-> no threads to kill.");
       return;
       }
   std::list<SDL_Thread*>::iterator it;
   for(it = mThreads.begin(); it != mThreads.end(); it++)
       {
       if( (*it) == THREADName)
           {
           SDL_KillThread( (*it) );
           mThreads.erase(it);
           (*it) = NULL;
           mLog->write(2,"[CMultiThreading]-> the thread with the following name was killed: %s.",THREADName);
           break;
           }
       }
   }

void PhantomSDL_CMULTITHREADING::waitForThread(SDL_Thread* THREADName, int* Status)
   {
   std::list<SDL_Thread*>::iterator it;

   for(it = mThreads.begin(); it != mThreads.end(); it++)
       {
       if( (*it) == THREADName)
           {
           SDL_WaitThread( (*it),NULL );
           break;
           }
       }
   }

void PhantomSDL_CMULTITHREADING::waitAllThreads()
   {
   std::list<SDL_Thread*>::iterator it;

   for(it = mThreads.begin(); it != mThreads.end(); it++)
       {
       SDL_WaitThread( (*it),NULL);
       mThreads.erase(it);
       (*it) = NULL;
       }
   }

void PhantomSDL_CMULTITHREADING::killAllThreads()
   {
   std::list<SDL_Thread*>::iterator it;

   for(it = mThreads.begin(); it != mThreads.end(); it++)
       {
       SDL_KillThread( (*it) );
       mThreads.erase(it);
       (*it) = NULL;
       }
   }


Creo que esta todo claro.
Por las dudas, dejo el .h
Código:
#ifndef _PHANTOMSDL_MULTI_THREADING
   #define _PHANTOMSDL_MULTI_THREADING
       class PHANTOMSDL_EXPORT PhantomSDL_CMULTITHREADING
           {
           private:
               //Private Properties And Methods For Singleton Pattern
               static PhantomSDL_CMULTITHREADING* mInstance;
               PhantomSDL_CMULTITHREADING();

               //Private Properties And Methods For Multithreading Handling
               std::list<SDL_Thread*> mThreads;
               PhantomSDL_CLOG *mLog;

           public:
               //Public Properties And Methods For Singleton Pattern
               static PhantomSDL_CMULTITHREADING* getInstance();
               static void erase();
               ~PhantomSDL_CMULTITHREADING();

               //Public Properties And Methods For Multithreading Handling
               void addThread( int (*THREADName)(void*), void* THREADData = NULL);
               void deleteThread(SDL_Thread* THREADName);
               void waitForThread(SDL_Thread* THREADName, int* Status = 0);

               void waitAllThreads();
               void killAllThreads();
           };
   #endif

Los problemas estan, de seguro para agregar threads :S...pero no entiendo bien como se manejan, y no logro hacerlos funcionar.

Si alguno tiene experiencia y tiene algo que decirme al respecto, le daria mil gracias.

Salu2
..phantom...
Caelis Studios, Life's just a game.
Caelis Studios Forums

ALRAZ


mLog->write(2,"[CMultiThreading]-> added a Thread with the following name: %s & data: %s",THREADName, THREADData);


Mmmm...
esa línea me parece muy sospechosa...
Estás tratando de escribir THREADName como si fuera un string, siendo que en realidad es un puntero a función... muy malo muy malo...

lo mismo para THREADData


mmm...
aún así, no dices claramente cual es tu problema...
si el problema está en que se te cuelga la aplicación, muy probablemente sea eso que te dije arriba.


Si el problema es que sospechas que no te está creando los Threads, prueba escribir algo desde el thread.

mmm...
no sé...
necesitaría más información sobre el problema en si

phantom

Bueno, misteriosamente si creo una aplicacion de ejemplo y añado un thread, funciona =S, pero mi pregunta es:

Si le añado un thread, el thread se ejecuta 1 sola vez:
¿como puedo hacer para que se ejecute varias veces?

La linea de mLog->... ... ... es totalmente obvio que no esta 100% bien :), comprobado esta que no me tilda la aplicacion, y tampoco imprime exactamente lo que yo querria, puesto que esta hecho "on-the-fly" y no necesariamente para que funcione como se esperaria.

Gracias!.

Salu2
..phantom...
Caelis Studios, Life's just a game.
Caelis Studios Forums

[EX3]

Cita de: "phantom"Si le añado un thread, el thread se ejecuta 1 sola vez:
¿como puedo hacer para que se ejecute varias veces?
No conozco a fondo SDL pero si se que en los sistemas operativos, al menos seguro en Windows, existen los cronometros con procesos asociados.

Yo en la dx_lib32 tengo implementado un sistema de cronometros basados en los de Windows a los que se les indica un intervalo de tiempo en milisegundos y la direccion de memoria de la funcion o procedimiento a ejecutar cada x intervalo en un thread paralelo al principal. No dispone SDL de algun mecanismo similar?

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

ALRAZ

Cita de: "phantom"
Si le añado un thread, el thread se ejecuta 1 sola vez:
¿como puedo hacer para que se ejecute varias veces?

haces un ciclo dentro del trhead
si es necesario que haga pausas, llamas SDL_Sleep dentro de ese ciclo.
(o algo así... hace mucho que no le muevo al SDL  :roll: )






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.