Вы находитесь на странице: 1из 8

Manejando Hilos en C#

Un Hilo o Thread es una unidad de procesamiento ms pequea que puede


realizar una tarea de manera paralela a la tarea principal.
Podemos crear tantos hilos como sean necesarios y sobre todo tantos como
soporte nuestro microprocesador.
Por lo tanto cuando hablamos de aplicaciones multitarea estamos hablando de
aplicaciones que ejecutan uno o varios hilos y estos ejecutan tareas diferentes al
mismo tiempo que el usuario interacta con una pantalla principal sin darse cuenta
de proceso que se ejecutan en segundo plano.
Para entender el funcionamiento de hilos crearemos la siguiente forma a la cual
agregaremos un botn y dos picturebox para que nos quede algo parecido a esto:

En botn agregamos en siguiente cdigo:


byte r = 0, g = 255;
bool b1 = false, b2 = true;
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)
b2 = false;
}
pictureBox1.BackColor = Color.FromArgb(r, 80, 100);
}
Una vez terminado ejecuten la aplicacin y presionen el botn, si todo est bien se
debe congelar la aplicacin, la ventana del programa no responder ya que el hilo
principal se qued bloqueado y nunca regreso el control a la forma. Y esto
solamente con una ventana.
Ahora para hacer que los 2 picturebox funcionen cambiando de color de manera
independiente sin que la forma o ventana se congelen, debemos crear 2 hilos, un
hilo por cada picturebox que trabajen en paralele a la forma principal, con sus
propios recursos. Por lo tanto deberemos eliminar lo que programamos en el botn
y crear 2 rutinas:
private void Hilo1()
{
byte r = 0, g = 255;
bool b1 = false, b2 = true;
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)
b2 = false;
}
pictureBox1.BackColor = Color.FromArgb(r, 80, 100);
}
}
private void Hilo2()
{
byte g = 255;
bool b2 = true;
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);
}
}
Una vez programadas las 2 rutinas, agregaremos el siguiente cdigo al botn:
Thread p1 =new Thread(new ThreadStart (Hilo1));
Thread p2 = new Thread(new ThreadStart(Hilo2));
p1.Start();
p2.Start();

Este cdigo genera un hilo por cada rutina, de esta manera cada rutina
tendr sus propios recursos sin interferir con la forma principal.
Ojo: No olviden agregar la librera System.Threading ya que sin esta no podrn
crear los hilos. Espero y les ayude en sus proyectos.
Explicacin:
Lo que se debe entender primero es que existen dos hilos: "p1" y "p2" (o dos
objetos de la clase "Thread", en ingls "Hilo") cada uno asociado a un mtodo: A
"p1" le corresponde "Hilo1" y a "p2" le corresponde "Hilo2". Lo que "p1" y "p2"
permiten es que ambos mtodos (Hilo1 e Hilo2) se ejecuten de manera
simultnea.
Todas las otras variables en el programa son de control. Los hilos empiezan a
ejecutarse al llamar al mtodo "Start" y se terminan con "Abort". El 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
jams
termina,
para
ello
se
usa
el
comando CualquierPictureBox.BackColor =Color.FromArgb(100, g, 80);
Tambin uso el mtodo Thread.Sleep que detiene la ejecucin del hilo durante el
tiempo en milisegundos que va entre parntesis. Esto es para que los colores
varen despacio y se puedan apreciar.
Cada vez que dentro de un mtodo se usa la palabra "Thread" sta se refiere al
hilo que est asociado a l.
Aqu est de nuevo el cdigo por si te da error el anterior
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();
}
}
}
Otro ejemplo de hilos:
using System;
using System.Threading;
public class Program
{
public static void Main()
{
Thread miThread = new Thread(new ThreadStart(MiFun));
miThread.Start();
MiFun();

}
public static void MiFun(){
Console.WriteLine("Hola, soy el thread");
for (int i=0; i<=10; i++) System.Console.WriteLine ("Iteracin:" + i);
}
}

El resultado en pantalla:
Hola, soy el thread
Iteracin:0
Iteracin:1
Iteracin:2
Iteracin:3
Iteracin:4
Iteracin:5
Iteracin:6
Iteracin:7
Iteracin:8
Iteracin:9
Iteracin:10
----Hola, soy el thread
Iteracin:0
Iteracin:1
Iteracin:2
Iteracin:3
Iteracin:4
Iteracin:5
Iteracin:6
Iteracin:7
Iteracin:8
Iteracin:9
Iteracin:10

Generado por el hilo

Generado por el mtodo

Otro ejemplo:
using System;
using System.Threading;

public class Program {


public class Mensajes{
public void Mostrar1() {
for(int i=0;i<10;i++){
Console.WriteLine("Escribiendo desde ==> 1");
Thread.Sleep(1000);
}
}
public void Mostrar2() {
for(int i=0;i<10;i++){
Console.WriteLine("Escribiendo desde ==> 2");
Thread.Sleep(1000);
}
}
}

public static void Main(){


Mensajes msg = new Mensajes();
Thread th1 = new Thread(new ThreadStart(msg.Mostrar1));
Thread th2 = new Thread(new ThreadStart(msg.Mostrar2));
th1.Start();
th2.Start();
}
}

Veremos en pantalla:
Escribiendo desde ==> 1
Escribiendo desde ==> 2
Tarea:
Crea un script que imprima los nmeros pares e impares del 1 al 100
utilizando hilos

Вам также может понравиться