• Viernes 29 de Marzo de 2024, 06:26

Autor Tema:   hilos en c#  (Leído 12898 veces)

veronica_abrigo

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
hilos en c#
« en: Martes 9 de Octubre de 2012, 17:40 »
0
Hola tengo que hacer una aplicacion como sigue:
En una pantalla mediante un boton debo agregar gugadores a una cancha luego ir guardando sus posiciones como una jugada y finalmete debo reproducir los movimientos mi pregunta es como hago para ejecutar por ejemplo 5 hilos y luego que terminen ejecutar tres por ejemplo y asi hasta que todos hayan recorrido todas sus posiciones ayuda por favor.

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re: hilos en c#
« Respuesta #1 en: Martes 9 de Octubre de 2012, 17:53 »
0
NO hacemos tareas, sin embargo, te puedo sugerir que deberías leer, para empezar el uso de los Hilos, si eres principiante te recomiendo leas el siguiente link:

http://toyscaos.tripod.com/hilos_cs.html

Igual puedes leerte esto:

http://msdn.microsoft.com/es-es/library/system.windows.forms.control.location(v=VS.80).aspx


Espero te sea de ayuda!.. Saludos.
@gabio87

veronica_abrigo

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: hilos en c#
« Respuesta #2 en: Martes 9 de Octubre de 2012, 21:21 »
0
Hola gracias por las paginas en realidad yo ya tengo adelantado algo ya puedo agregar los jugadores y hacer que estos se muevan en cualquier direccion  y utilizo el sincrinizador mutex para evitar que todos los hilos accedan al metodo que realiza los movimiento sin embargo al utilizarlo no se ejecutan los hilos simultaneamente pero si le quito el mutex los jugadores no se mueven correctamente que debo utilizar para que ellos se ejecuten bien

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re: hilos en c#
« Respuesta #3 en: Martes 9 de Octubre de 2012, 22:44 »
0
sin embargo al utilizarlo no se ejecutan los hilos simultaneamente pero si le quito el mutex los jugadores no se mueven correctamente que debo utilizar para que ellos se ejecuten bien

Leyendo un poco ( http://msdn.microsoft.com/es-es/library/system.threading.mutex(v=vs.80).aspx ), me encontré con está parte específica "Cuando dos o más subprocesos tienen que obtener acceso a un recurso compartido al mismo tiempo, el sistema necesita un mecanismo de sincronización para garantizar que sólo uno de los subprocesos utilice el recurso en ese momento. ". Lo que puedo entender es que el método sólo puede ser utilizado una vez AL MISMO TIEMPO, por lo cuál es correcto lo que pasa con tú código.

En realidad nunca había usado el Mutex, yo realizaba la comunicación entre otros procesos con delegados, sin embargo ya leí acerca del Mutex (muy útil e interesante por cierto) y entendí como funciona.

Sin embargo puede ser que tú error este en otra parte de tú lógica, también podrías poner parte de tú código para revisar si no hay algún error.

Saludos!
@gabio87

veronica_abrigo

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: hilos en c#
« Respuesta #4 en: Miércoles 10 de Octubre de 2012, 01:08 »
0
Ahi va el codigo espero me pueda ayudar
private void button1_Click(object sender, EventArgs e)//REPRODUCIR
 {
              int i = 0;
                do
                {
                    ejecutarHilos();
                    i++;

                } while (hilo.IsAlive == false && i < numPasos - 1); //num pasos es el numero movimientos
}
public void ejecutarHilos(){
               int c = 0;
                           
                while (numHilos > c)  // numHilos es el numero de jugadores que se mueven al mismo tiempo osea los hilos
                {                   
                    hilo = new Thread(Sumar);
                    hilo.IsBackground = true;
                    Thread.Sleep(100); //Para que no salgan dos jugadores juntos
                    hilo.Start();
                    hilo.Join();
                    c++;
                }
}

 private void Sumar() {
                ArrayList AL = new ArrayList();
                JugadoreRojo JR;
                JugadoreVerde JV;
                Pelota Pp;
                String nom = "";
                String xx = "";
                String yy = "";
                int pp = 0;
                Object o;
                o = ListaPosiciones[contador];

                if (o is JugadoreVerde)
                {
                    JV = (JugadoreVerde)o;
                    nom = Convert.ToString(JV.indice);
                    xx = Convert.ToString(JV.ubicacion.X);
                    yy = Convert.ToString(JV.ubicacion.Y);
                    pp = JV.paso;
                    contador++;
                    //ob=(Object)JV;               
                }
                if (o is JugadoreRojo)
                {
                    JR = (JugadoreRojo)o;
                    nom = Convert.ToString(JR.indice);
                    xx = Convert.ToString(JR.ubicacion.X);
                    yy = Convert.ToString(JR.ubicacion.Y);
                    pp = JR.paso;
                    contador++;
                }
                if (o is Pelota)
                {
                    Pp = (Pelota)o;
                    nom = Convert.ToString(Pp.indice);
                    xx = Convert.ToString(Pp.ubicacion.X);
                    yy = Convert.ToString(Pp.ubicacion.Y);
                    pp = Pp.paso;
                    contador++;
                }
                MyDelegado MD = new MyDelegado(Mostrar);
                IAsyncResult resultado = MD.BeginInvoke(nom, xx, yy, pp, null, null);
                MD.EndInvoke(resultado);
            //Esto me permitesaber que jugador exactamente es o si es la pelota
       }

public void mostrar(String n, String xx, String yy, int pp)){
//Donde n es el nombre del controlque representa al jugador, xx y yy son el punto al que debe llegar,pp es la posicion actual 
 // Esto es solo una parte del codigo que hace el movimiento
             
                Point punto = new Point(Convert.ToInt32(xx), Convert.ToInt32(yy));
                Mutex mutex = new Mutex();
                          int V = 0;
                          int V2 = 30;
                          pun = JR.Location;
                          int D = Convert.ToInt32(Math.Sqrt(Math.Pow(punto.X - pun.X, 2) + Math.Pow(punto.Y - pun.Y, 2)));
                          V = D / 30;
                if (punto.X < pun.X && punto.Y > pun.Y)
                        {
                            mutex.WaitOne();
                         double  m = (punto.Y - pun.Y) /(double)( punto.X - pun.X);
                            int x = pun.X - 1;
                           
                            while (x >= punto.X )
                            {
                                int y = (int)Math.Round(m*(x - punto.X)+punto.Y,0);
                                JR.Location = new Point(x,y);// JR es un jugador
                                pictureBox1.Refresh();
                                Thread.Sleep(V2 - V);
                                x = x-1;
                            }
                            hilo.Abort();
                            mutex.ReleaseMutex();
                        }
       
}