30 jul 2008

Inicializar un thread, capturar eventos y usar Invoke (VB.NET)

En este ejemplo haremos una aplicación que al presionar un botón creará un thread aparte que "hará algo", en este caso no hará nada, solo hará tiempo, pero éste thread lanzará un evento al inicio y otro al fin de su ejecución, nosotros capturaremos esos eventos y los mostraremos en pantalla.

Como la interfaz de usuario y el thread obviamente pertenecen a distintos hilos, será necesario utilizar un Delegate con el método Invoke del control que utilizaremos, de lo contrario tendremos una InvalidOperationException por CrossThread

Lo primero que haremos será asignar los manejadores a los eventos que hemos declarado anteriormente, para eso utilizaremos AddHandler y AddressOf.

#Region " Eventos de Thread y sus handlers"
Private Event InicioThread(ByVal Inico As DateTime)
Private Event FinThread(ByVal Fin As DateTime)

Private Trabajando As Boolean = False

Public Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
AddHandler InicioThread, AddressOf App_InicioThread
AddHandler FinThread, AddressOf App_FinThread
End Sub

Private Sub App_InicioThread(ByVal Inicio As DateTime)
Trabajando = True
If TextBox1.InvokeRequired Then
TextBox1.Invoke(New MostrarEnTextBox_Delegate(AddressOf MostrarEnTextBox), TextBox1, Inicio.ToString())
Else
MostrarEnTextBox(TextBox1, Inicio.ToString())
End If
If TextBox2.InvokeRequired Then
TextBox2.Invoke(New MostrarEnTextBox_Delegate(AddressOf MostrarEnTextBox), TextBox2, "Todavía haciendo algo...")
Else
MostrarEnTextBox(TextBox2, "Todavía haciendo algo...")
End If
End Sub

Private Sub App_FinThread(ByVal Fin As DateTime)
Trabajando = False
If TextBox2.InvokeRequired Then
TextBox2.Invoke(New MostrarEnTextBox_Delegate(AddressOf MostrarEnTextBox), TextBox2, Fin.ToString())
Else
MostrarEnTextBox(TextBox2, Fin.ToString())
End If
End Sub
#End Region


Como se puede ver en los maejadores de eventos utilizamos un Delegate del método que inserta el texto en las TextBox, eso es porque requiere parámetros, sino lo hubiésemos podido hacer directamente usando AddressOf.
Así que lo siguiente será crear el método que ingresa texto en las TextBox y su correspondiente Delegate.

#Region " Delegate para Invoke "
Private Delegate Sub MostrarEnTextBox_Delegate(ByVal txt As TextBox, ByVal str As String)

Private Sub MostrarEnTextBox(ByVal txt As TextBox, ByVal str As String)
txt.Text = str
End Sub
#End Region


Como dice al principio del post, ésta aplicación tiene un botón que es el que inicia un nuevo hilo, así que agregaremos el botón y en el evento click llamaremos a un método que creará e iniciará el nuevo Thread. Adicionalmente, tenemos un flag para que no permitir la creación de más de un hilo por vez, su valor se cambia con los eventos del Thread.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Not Trabajando Then
InicializarThread()
Else
MessageBox.Show("Hay un 'hilo haciendo' algo aún. Intente nuevamente en unos segundos.", "Hilo trabajando", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub

#Region " Thread "
Private Sub InicializarThread()
Dim t As New Thread(AddressOf HacerAlgo)
t.Name = "Thread_HacerAlgo"
t.IsBackground = True
t.Start()
End Sub

Private Sub HacerAlgo()
RaiseEvent InicioThread(DateTime.Now)
For i As Byte = 0 To 254
Thread.Sleep(30)
Next
RaiseEvent FinThread(DateTime.Now)
End Sub
#End Region


29 jul 2008

Como abrir una web en el navegador por defecto

Este es un tip pequeño, simplemente lanzaremos un proceso con la URL a abrir, el Sistema Operativo se encargará de usar la aplicación por defecto para manejar la URL, en nuestro caso un navegador web.



Para probarlo crearemos una nueva aplicación de Winforms y en el form que se crea por defecto agregaremos un LinkLabel, al cual pondremos como texto la URL que queremos abrir, aunque puede ser cualquier texto, en nuestro ejemplo utilizaremos el texto de la etiqueta para ejecutar el proceso.


Ahora nos resta programar el evento Click del LinkLabel para que lance el proceso:


Private Sub lnkAprendiendoNet_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles lnkAprendiendoNet.LinkClicked
Process.Start(lnkAprendiendoNet.Text)
End Sub

23 jul 2008

Implementación de Singleton y manejo de hilos en C#

Via NuevosProgramadores.com me encuentro con 2 artículos, uno donde explican como implementar el patrón Singleton y otro donde explican el manejo de hilos y delegates. Todo está implementado en C# y se puede descargar el código fuente del ejemplo.

Link: Implementación de Singleton en C#

Link: Manejo de hilos en C# + delegates + invoke

17 jul 2008

Hola Mundo, la primera aplicacion

Como es clásico en el mundo de la programación, lo primero que haremos será el clásico Hola Mundo!

En esta ocasión utilizaremos una Aplicación de Consola en lenguaje VB.Net, para ello iremos a crear un nuevos proyecto y seleccionaremos Visual Basic y Console Application.


Nueva aplicación de consola

Eso nos creará la aplicación y automáticamente agregará un módulo con el procedimiento que se ejecutará al iniciar la aplicación.

Module Module1

Sub Main()

End Sub

End Module


A continuación agregaremos 2 líneas, la primera se encargará de escribir en nuestra consola el texto Hola Mundo!, y la segunda esperará a que el usuario presione una tecla para continuar la ejecución del código... que en este caso llevará al final de la aplicación.

Module Module1

Sub Main()
Console.WriteLine("Hola Mundo!")
Console.Read()
End Sub

End Module


Y así de simple hemos escrito nuestra primera aplicación en .Net, ahora sólo resta ejecutarla, para lo cual presionaremos la tecla F5.

Hola Mundo, nuestra primera aplicación de consola

11 jul 2008

Que es el .net framework?

Sólo una breve introducción, por si alguien aún no está familiarizado con ésta tecnología.

.Net Framework es una plataforma de desarrollo de software que Microsoft lanzó al mercado como respuesta a la creciente couta del mercado que está tomando la tecnología Java de Sun Microsystems.

Se trata de un conjunto de utilidades que gracias a la norma, (incluída en ECMA-335, ISO/IEC 23271), que define la implementación de BCL, permite su implementación en varias plataformas; una de ellas es Mono, un proyecto que pretende ser la implementación libre de .Net para GNU/Linux.

A grandes rasgos, el framework permite el desarrollo de aplicaciones en varios lenguajes gracias al CLR. Básicamente, todo se compila en un lenguaje intermedio, que es compatible con CLR, llamado MSIL, el cuál está basado en CLS.

Luego para ejecutar las aplicaciones se utiliza un compilador JIT el cual ejecuta el código máquina real en la máquina del cliente, lo cual permite independencia con respecto a la arquitectura.

En la imagen se puede ver la estructura básica del .Net Framework.

Estructura básica del framework

Fuente: Wikipedia