viernes, 9 de septiembre de 2011

Hilos en c#

Crear un nuevo proyecto Aplicación de windows Form
Agregar dos Picturebox's: pictureBox1 y pictureBox2. Al final, debe verse así:




Debemos  hacer uso del espacio de nombres: "Threading"

using System.Threading;

Declaramos de manera Global los objetos p1 y p2 de la clase  Thread

Thread p1;
Thread p2;

Declaramos de manera Global también las Varialbles del tipo byte: r y g
 
byte r, g;

y del tipo bool las variables b1 y b2

 

Los metodos que pasaremos como parámetro a estos hilos serán:
Hilo1 ()
Hilo2 ()

 public void Hilo1() {

Doble click sobre el Formulario para programar en el evento Load del mismo:

   private void Form1_Load(object sender, EventArgs e)
        {
            r = 0; g = 255; b1 = false; b2 = true;
 
            p1 = new Thread(new ThreadStart(Hilo1));
            p2 = new Thread(new ThreadStart(Hilo2));
 
            p1.Start();
            p2.Start();
        }


El código debería quedar como el siguiente:

using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        Thread p1;
        Thread p2;
 
        byte r, g;
        bool b1, b2;
       
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            r = 0; g = 255; b1 = false; b2 = true;
 
            p1 = new Thread(new ThreadStart(Hilo1));
            p2 = new Thread(new ThreadStart(Hilo2));
 
            p1.Start();
            p2.Start();
        }
       
        public void Hilo1() {
            while (true)
            {
                Thread.Sleep(10);
 
                if (r >= 0 && r <= 255 && b1 == false)
                {
                    r++;
                    if (r == 255)
                        b1 = true;                   
                }
 
                if (r >= 0 && r <= 255 && b1 == true)
                {
                    r--;
                    if (r == 0)
                        b1 = false;
                }     
               
                pictureBox1.BackColor = Color.FromArgb(r, 80, 100);
            }
       }
 
        public void Hilo2() {
            while (true)
            {
                Thread.Sleep(10);
 
                if (g >= 0 && g <= 255 && b2 == false)
                {
                    g++;
 
                    if (g == 255)
                        b2 = true;
                }
 
                if (g >= 0 && g <= 255 && b2 == true)
                {
                    g--;
 
                    if (g == 0)
                        b2 = false;
                }     
               
                pictureBox2.BackColor = Color.FromArgb(100, g, 80); 
            }                  
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            p1.Abort();
            p2.Abort();
        }
    }
}


Lo que se debe entender primero es que existen dos hilos: "p1" y "p2" (o dos objetos de la clase "Thread", en inglés "Hilo") cada uno asociado a un método:

A "p1" le corresponde "Hilo1"
y a "p2" le corresponde "Hilo2".

Lo que "p1" y "p2" permiten es que ambos métodos (Hilo1 e Hilo2) se ejecuten de manera simultánea.

Todas las otras variables en el programa son de control. Los hilos empiezan a ejecutarse al llamar al método "Start" y se terminan con "Abort". C# no permite llamar de nuevo a "Start" para un hilo que ya se está ejecutando.
Lo que hace el programa simplemente es variar el color de ambos PictureBoxes en un bucle que jamás termina, para ello se usa el comando

CualquierPictureBox.BackColor = Color.FromArgb(100, g, 80);

También uso el método Thread.Sleep que detiene la ejecución del hilo durante el tiempo en milisegundos que va entre paréntesis. Esto es para que los colores varíen despacio y se puedan apreciar.
Cada vez que dentro de un método se usa la palabra "Thread" ésta se refiere al hilo que está asociado a él.
            while (true)
            {
                Thread.Sleep(10);
 
                if (r >= 0 && r <= 255 && b1 == false)
                {
                    r++;
                    if (r == 255)
                        b1 = true;                   
                }
 
                if (r >= 0 && r <= 255 && b1 == true)
                {
                    r--;
                    if (r == 0)
                        b1 = false;
                }     
               
                pictureBox1.BackColor = Color.FromArgb(r, 80, 100);
            }
       }
 
        public void Hilo2() {
            while (true)
            {
                Thread.Sleep(10);
 
                if (g >= 0 && g <= 255 && b2 == false)
                {
                    g++;
 
                    if (g == 255)
                        b2 = true;
                }
 
                if (g >= 0 && g <= 255 && b2 == true)
                {
                    g--;
 
                    if (g == 0)
                        b2 = false;
                }     
               
                pictureBox2.BackColor = Color.FromArgb(100, g, 80); 
            }                  
        }
bool b1, b2;

2 comentarios:

  1. Muy buen ejemplo y explicacion. Saludos desde Reynosa, Mexico.

    ResponderEliminar
    Respuestas
    1. NECESITO AYUDA CUANDO INTENTO CORRER EL CODIGO ME DA VARIOS ERRORES

      Eliminar