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?
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
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.
Entonces para eso usa mejor ManualResetEvent:
http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx
Los métodos Set y WaitOne :)
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
Lo del lag ni idea :( A ver si alguien puede echarte un cable con eso (miraré de todas formas).
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.
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
Joer, estoy flipando con mi propio post :p