21 julio, 2007

Threading

Todo desarrollador que se preocupe por el rendimiento de las aplicaciones que implementa debe conocer sobre el desarrollo con múltiples hijos (threads). El namespace system.threading contiene lo necesario para crear y administrar el multi-hilo de una aplicación.

Para crear un thread es necesario seguir los siguientes pasos:

  • Crear un método sin argumentos y que no retorne datos.
  • Crear un ThreadStart delegate que haga referencia al método creado en el paso anterior
  • Crear un objeto Thread que haga referencia al ThreadStart delegate anterior.
  • Invocar al thread.start para iniciar la ejecución del nuevo hilo.

Veamos un ejemplo de cómo crear un thread que despliega una línea de texto en la consola.

Imports System.threading

Module Module1

Sub DespliegaMensaje()

Console.WriteLine("Mensaje, generado por el hilo: {0}", Thread.CurrentThread.ManagedThreadId)

End Sub

Sub Main()

Dim metodo_a_ejecutar As New ThreadStart(AddressOf DespliegaMensaje)

Dim NuevoHilo As New Thread(metodo_a_ejecutar)

NuevoHilo.Start()

Console.ReadKey()

NuevoHilo.Abort()

End Sub

End Module

Ahora veamos un ejemplo con varios threads

Imports System.threading

Module Module1

Sub DespliegaMensaje()

For i As Integer = 1 To 5

Console.WriteLine("Mensaje, generado por el hilo: {0}", Thread.CurrentThread.ManagedThreadId)

Next

End Sub

Sub Main()

Dim metodo_a_ejecutar As New ThreadStart(AddressOf DespliegaMensaje)

Dim hilos(5) As Thread

For i As Integer = 1 To 5

hilos(i) = New Thread(metodo_a_ejecutar)

hilos(i).Start()

Next

Console.ReadKey()

For i As Integer = 1 To 5

hilos(i).Abort()

Next

End Sub

End Module

En algunas ocasiones es necesario esperar que alguno de los hilos finalice para proseguir con la ejecución de nuestro código, para esto utilizamos el método join:

Hilo.Join()

También podemos controlar la prioridad de cada hilo, esto lo hacemos con el método priority utilizando el enumerado ThreadPriority.

Highest

La más alta prioridad

AboveNormal

Alta prioridad

Normal

Prioridad normal

BelowNormal

Prioridad baja

Lowest

La más baja prioridad

14 julio, 2007

Manipulando imágenes

El dot net framework nos brinda algunas herramientas para realizar algunas labores comunes con imágenes. El namespace System.Drawing.Image nos brinda las utilidades necesarias para trabajar con BMP, JPG y TIF, realizando labores como agregarles texto, marcas de agua o cambiarles el tamaño.

Veamos cómo realizar algunas labores comunes,

Cargar una imagen previamente guardada en disco:

Dim Foto As Image = Image.FromFile("C:\Foto.bmp")

Crear una nueva imagen de 640 por 480 pixeles

Dim nueva_imagen As Bitmap = New Bitmap(640, 480)

En el siguiente ejemplo se crea una imagen nueva y se le agrega un rectángulo y un texto y luego se guarda en disco.

Imports System.drawing

Imports System.Drawing.Imaging

Module Module1

Sub Main()

Dim Nueva_imagen As New Bitmap(640, 480)

Dim Nuevo_Grafico As Graphics = Graphics.FromImage(Nueva_imagen)

Dim brocha As Brush = Brushes.AliceBlue

Dim letra As New Font("Arial", 12, FontStyle.Bold)

Dim formato As New StringFormat()

formato.Alignment = StringAlignment.Center

formato.LineAlignment = StringAlignment.Center

Nuevo_Grafico.DrawRectangle(Pens.White, 10, 10, 220, 100)

Nuevo_Grafico.DrawString("Creando Nueva Imagen", letra, Brushes.DarkGreen, 110, 50, formato)

Nueva_imagen.Save("c:\temp\prueba.jpg", ImageFormat.Jpeg)

End Sub

End Module

07 julio, 2007

Gráficos (Líneas, figuras geométricas)

En el namespace system.drawing podemos encontrar todo lo necesario para poder crear líneas y figuras geométricas que ayuden a mejorar la presentación de las aplicaciones que desarrollados, y lo mejor es que lo podemos hacer con unas pocas líneas de código.

Pero ¿cómo creamos la figura?, lo primero es crear un objeto del tipo graphics, luego creamos un pen, y luego llamamos el método de graphics según sea lo que vamos a dibujar ej. DrawPie, DrawRectangle, DrawLine, DrawEllipse, entre otros. Pero veamos un ejemplo concreto (se requiere una Windows aplication):

Dim figura As Drawing.Graphics

Dim lapiz As New Pen(Color.Chocolate, 5)

figura = Me.CreateGraphics

figura.DrawEllipse(lapiz, 80, 50, 30, 30)

figura.DrawEllipse(lapiz, 160, 50, 30, 30)

figura.DrawEllipse(lapiz, 10, 10, 250, 250)

figura.DrawLine(lapiz, 135, 100, 135, 140)

figura.DrawArc(lapiz, 90, 100, 90, 90, -180, -180)

También este namespace tiene otras utilidades para controlar la posición, tamaño, y el aspecto de los controles visuales. Veamos:

Empezando por lo más básico, una de las primeras cosas que tenemos que definir es la posición de la figura que deseamos dibujar, para esto usamos el sistema de coordenadas "x" y "y". Donde "x" es la distancia en pixeles desde el límite izquierdo y "y" es la distancia en pixeles desde el límite superior de nuestro contenedor, por ejemplo.

Control.Location = New Point(10, 10)

También es muy común definir el tamaño de la figura, para esto definimos el ancho y el alto de la siguiente forma.

Control.Size = New Size(30, 30)

Una vez definida la posición y el tamaño podemos definirle el color. Veamos,

Control. BackColor = Color.Blue