Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





c# Multithreading y xbox

Iniciado por blau, 11 de Enero de 2011, 09:06:00 PM

« anterior - próximo »

blau

Buenas, :)

ando liado con la creacion de un segundo hilo para que salve en segundo plano en la xbox.

el tema es que no controlo mucho esto, y encontre un codigo que usa un monitor para parar la ejecucion del hilo hasta que tenga que realizar alguna operacion de salvado, y el problema es que el compact framework no soporta esta clase.

Pongo el codigo:

//Codigo para inicializar el hilo
        void InitializeSavingThread()
        {
            hilo = new Hilo("Save");
            hilo.Pause();
            Thread thread = new Thread(new ThreadStart(hilo.Work));
            thread.Start();
        }


//Clase hilo que gestiona lo necesario
         public class Hilo
        {       
            private bool paused = false;
            private bool end = false;
            private string name = "";

            public Hilo(string name)
            {
                this.name = name;
                this.end = false;
                this.paused = false;
            }

            public void Work()
            {
#if XBOX
                Thread.CurrentThread.SetProcessorAffinity(5);
#endif
                while (!end)
                { 
                 
                    Thread.Sleep(2000);

                    lock (this)
                    {
                        if (this.paused) System.Threading.Monitor.Wait(this);
                    }

                    if (StateStoreHighScores.LiveDirty) StateStoreHighScores.SaveLiveScoresSinThread();
                    if (StateStoreHighScores.LocalDirty) StateStoreHighScores.SaveLocalScoresSinThread();
                    if (StateStoreHighScores.LockDirty) StateStoreHighScores.SaveLockLevelStatus();

                    LocalDirty = LiveDirty = LockDirty = false;
               
                }
            }

            public void Pause()
            {
                lock (this)
                {
                    this.paused = true;
                }
            }

            public void Play()
            {
                lock (this)
                {
                    this.paused = false;
                    Monitor.PulseAll(this);
                }
            }

            public void End()
            {
                lock (this)
                {
                    this.end = true;
                    Monitor.PulseAll(this);
                }
            }
        }
    }


¿La pregunta es como puedo hacer algo equivalente para la xbox?

Vicente

Esto, no me entero mucho de lo que quieres hacer, pero la Xbox si soporta Monitor (lock es simplemente syntactic sugar para Monitor.Enter y Monitor.Exit), lo que no soporta es Wait y PulseAll.

Si explicas que quieres hacer lo mismo te puedo echar un cable, pero todos esos locks y tal son solo si se puede dar el caso que dos hilos puedan pasar por ahí, si es algo que se va a hacer en segundo plano no necesitas tanto jaleo, simplemente creas el hilo y a correr...

Además el código está lleno de lock (this), eso es un peligro que te cagas, ojalá el Visual diera un warning por eso :S

blau

Basicamente, lo que quiero es tener un hilo en segundo plano para escribir a disco.

Lo que pretendo hacer es que ese hilo este siempre en ejecucion, y cuando decida salvar, enviarle una señal (monitor.pulse) para que se reanude, escriba en disco lo que necesite, y se suspenda su ejecucion (monitor.wait)


Probé a crear el hilo, ejecutar la operación, y destruirlo, pero me seguía generando lag, y se lo achaque a que la creación del hilo debe tener un coste. Es por eso que quiero dejarlo en suspenso y reanudarlo cuando lo necesite.





blau

Pues va a ser eso  :o


Ya lo he probado y funciona, pero sigue haciendome ese pequeño lag cuando guarda datos. :(

En fin que se va a quedar asi.

Muchas gracias


Vicente

Lo del lag ni idea :( A ver si alguien puede echarte un cable con eso (miraré de todas formas).

blau

Quiza se junten varios factores, porque grabo justo cuando libero mucha memoria, y puede ser que coincida el recolector con la grabación.

El caso es que sin grabar no laggea, pero vamos que tampoco es grave.

Si quieres comprobar lo que hace he subido el spermatozoon a test review, cuando terminas la fase y se queda solo el ovulo en la pantalla, es cuando salvo los highscores y el progreso de pantallas superadas en caso de que se desbloquee alguna.

Dandole a la X del gamepad 1 muestra informacion de depuracion, en concreto cuando se activa el hilo, lo que graba, y cuando para.

Un saludo.

WaaghMan

En el foro de XNA hay un tema que va de lo mismo, es también sobre un gestor de guardado/cargado, orientado a ser genérico para que se use para todo.

Hay una discusión larga al respecto, aunque la verdad es que al final no publiqué el código que acabé usando en su momento. Ahora lo reorganicé todo para usar el mismo sistema para ejecutar tareas de cualquier tipo en un hilo separado, otro día pongo el código.

Se puede leer aquí http://www.stratos-ad.com/forums/index.php?topic=12975.0
Milkstone Studios - Autores de Avatar Ninja!, Little Racers, MotorHEAT y Wool en Xbox Live Indie Games







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.