Información adicional: Control.Invoke se debe utilizar para interactuar con controles creados en un subproceso independiente.|
0 comentarios Publicado por Julio en 9:51Este error me ocurrió al intentar acceder a los controles internos de un formulario, por ejemplo un Label, desde un hilo creado por medio de la clase Thread.
A traves de este formulario:
El código del evento del botón al ser presionado es el siguiente:
- Sub MetodoHilo(ByVal value As String)
- Me.Label1.Text = value
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Dim hilo1 As Threading.Thread = New Threading.Thread(AddressOf Me.MetodoHilo)
- hilo1.Start()
- End Sub End Class
Public Class formulario
Cuando el programa intenta ejecutar la línea Me.Label1.Text = "i" ocurre el error y se recomienda la Información adicional que se encuentra en el título.
La solución:
Inicialmente se debe crear una funcion diferente a la del hilo donde se modifique cualquier variable interna del formulario por ejemplo:
Sub cambiandoLabel(ByVal value As String)
- Me.Label1.Text = value
En este caso la función cambiandoLabel cambia el texto de Label1
Ahora es necesario declarar un delegado, el cual siendo una referencia a una función permitirá que dentro del hilo se ejecute la función cambiandoLabel.
Public Delegate Sub cambiandoLabeldelegate(ByVal value As String)
El delegado debe contener los parametros similares a la funciona la que apunta.
La siguiente línea permite crear entonces un apuntador hacia la función cambiandoLabel por medio del delegado
Public cambio As New cambiandoLabeldelegate(AddressOf cambiandoLabel)
Ahora se usa el metodo invoke que recbe como parametro el delegado instanciado. Este metodo se usará dentro de la funcion que ejecuta el hilo en este caso metodoHilo
Sub MetodoHilo()
- Me.Invoke(Me.cambio, New Object() {"Nueva cadena del Label"})
New Object() {"Nueva cadena del Label"} se utiliza para entregar los parametros correspondientes.
Finalmente el código total es el siguiente:
- Dim t As String
- Public Delegate Sub cambiandoLabeldelegate(ByVal value As String)
- Private cambio As New cambiandoLabeldelegate(AddressOf cambiandoLabel)
- Sub cambiandoLabel(ByVal value As String)
- Me.Label1.Text = value
- End Sub
- Sub MetodoHilo()
- Me.Invoke(Me.cambio, New Object() {"Nuevo cadena del Label"})
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Dim hilo1 As Threading.Thread = New Threading.Thread(AddressOf Me.MetodoHilo)
- hilo1.Start()
- End Sub
Public Class formulario
End Class
Etiquetas: delegado, error, hilo, Invoke, visual basic
Servicios Web en .NET por medio de un proyecto Smart Device
0 comentarios Publicado por Julio en 22:42El desarrollo con servicios web es una estrategia muy interesante a la hora de realizar proyectos relacionados con conectividad, o distanciamiento entre máquinas o personas; .NET es una tecnología relativamente nueva pero ha hecho un buen trabajo a mi parecer con el tratamiento de estos.
Los proyectos en .NET para dispositivos móviles son llamados Smart Device, y cuentan con una gran conjunto de herramientas a la hora de programar que hacen la tarea muy agradable, a veces te puedes sentir realizando "programación para señoritas" (un dicho popular).
Para conocer más a fondo sobre la publicación de servicios web es necesario conocer acerca de los archivos WSDL, estos son archivos escritos en XML utilizados para describir la mecánica de un servicio, en este caso un servicio lo tomaremos como una operación sistemática o programada que se ejecutará cuando alguien lo necesite.
Para un servicio de sumar dos números por ejemplo, el WSDL explicará que los parámetros de entrada serán dos números de tipo entero y la salida será otro número tipo entero, así de sencillo. Para la creación de un aplicativo Smart Device que utilice servicios web no es necesario conocer a fondo acerca de la estructura de un archivo WSDL, basta con saber que será necesario de uno de ellos para crear un conjunto de clases que manejen la conectividad con el servicio; a este conjunto de clases las llamaremos STUB. Una vez creado el STUB es muy sencillo entonces conectarse con cualquier servicio.
Cualquier persona puede publicar sus servicios, y darse a conocer de esta manera; para este tutorial se utilizarán los servicios publicados por la web de www.elguille.info en la cual se ha dado a conocer un conjunto de servicios utiles y sencillos, realizados por medio del framework .NET.
Revisa http://www.elguille.info/net/WebServices/indice.asp para más documentación acerca de la creación de servicios Web en .NET.
Un servicio muy interesante publicado por elguille es un conversor de grados centígrados a farenheit; el archivo publicado es el siguiente:
http://www.elguille.info/NET/WebServices/CelsiusFahrenheit.asmx?WSDL
Este archivo será utilizado para crear un aplicativo que se ejecute en un móvil pocket PC y se conecte al servicio de elguille para convertir grados centígrados en farenheit.
A continuación se detallan los pasos para crear un proyecto Smart Device con .NET
En la ventana de nuevo proyecto dar un nombre al proyecto, este proyecto tiene nombre CentigradosAFarenheit, también seleccionar uno de los lenguajes de programación que provee el framework, en este caso se utilizará Visual Basic, al expandir la opción de visual Basic seleccionamos Smart Device y de las plantillas seleccionamos el "Proyecto de Smart Device".
En la parte de selección de la version de los framework de .NET a utilizar, seleccionamos entre ".NET Framework 2.0", ".NET Framework 3.0" o ".NET Framework 3.5" la utilización de cada uno de ellos puede repercutir en el hecho de poder utilizar herramientas cada ves más actualizadas, por lo tanto es recomendable utilizar el último. En un próximo post hablaré sobre la diferencia fundamental entre utilizar las diferentes versiones del framework .NET.
Al cliquear aceptar aparece la ventana "Agregar nuevo proyecto de Smart Device", donde es necesario seleccionar la plataforma de destino, poseo una HP 4150 la cual tiene sistema operativo Windows Mobile 2003. En plantillas selecciono "Aplicación de dispositivo", este tipo de proyectos permite una forma fácil de implementar formularios. En el Blog de Andoni Arroyo encontré un articulo muy interesante sobre la diferencia entre las diferentes versiones de Framework que ofrece .NET.
Una vez se presiona "aceptar" se muestra una ventana con los archivos del proyecto en el panel "Explorador de soluciones", con dos archivos "My Proyect" y "Form1.vb", el segundo muestra la imagen de una PDA, sobre la cual es posible añadir los diversos elementos del panel "cuadro de Herramientas".
A continuación agregamos algunos elementos sobre la PDA, de manera que se obtenga el siguiente aspecto.
Es importante saber que el botón aceptar tiene nombre "Button1", el cuadro de texto tiene nombre "TextBox1" y el label de respuesta "Label3".
Ahora después de todo este proceso, es hora de utilizar el servicio web creado por elguille, para ello se utiliza una herramienta de .NET que permite conectarnos con el servicio para conocer que provee, esta herramienta es la referencia web.
En la ventana emergente se debe ingresar la URL del archivo WSDL y presionar "Ir". Aparecerán los metodos publicados por este servicio, en este caso:
- CaF ( valor As double ) As double
- FaC ( valor As double ) As double
Se presiona entonces el botón "Agregar referencia", lo que crea una carpeta llamada "Web References" en el Explorador de soluciones. Ahora estamos listos para acceder al servicio.
En la vista diseño del Form1 presionamos doble click sobre el botón "Aceptar" lo cual abre la ventana en la cual programar en código visual basic la aplicación, y posiciona el cursor sobre el método escuchador de la presión de dicho botón. Agregamos el siguiente código al evento Button1_Click.
1.Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
2. Try
3. Dim stub As info.elguille.www.Conversor = New info.elguille.www.Conversor
4. Dim entrada_centigrados As Double = Double.Parse(TextBox1.Text())
5. Dim resultado As Double = stub.CaF(entrada_centigrados)
6. Label3.Text = resultado
7. Catch ex As System.Net.WebException
8. Label3.Text = "El dispositivo no tiene acceso a internet"
9. End Try
10.End Sub
En la línea 3 del código anterior se instancia un objeto llamado stub, por medio de ésta instancia es posible acceder a los métodos publicados por elguille; en este caso se accede a el metodo Caf enviandole la variable entrada_centigrados que toma la entrada del Texbox1.
El resultado puede observarse en el Label3, pero en caso de una excepción de red este label contendrá el texto "El dispositivo no tiene acceso a internet".
Para realizar la prueba del aplicativo se utiliza un emulador o directamente instalando en un dispositivo pocket PC; el emulador debe estar configurado para conectarse a internet. No olvidar que para que el equipo de escritorio se conecte con una pocket pc se debe instalar el software "Centro de dispositivos de Windows Mobile".
Para realizar la prueba en el dispositivo se debe generar un archivo de extensión CAB, la forma de hacerlo es por medio de un nuevo proyecto CAB para Smart Device.
En el proyecto generado en el explorador de soluciones buscamos la opcion "Resultados del proyecto"
En la ventana emergente seleccionamos "Resultado principal".
Y sobre el proyecto CAB damos la opción de generar.
Si finalmente la salida es la siguiente
Windows CE CAB Wizard
========== Generar: 2 correctos o actualizados, 0 incorrectos, 0 omitidos ==========
Vamos por buen camino.
El archivo CAB generado se puede encontrar yendo a la carpeta del proyecto, un atajo es por medio de la opción "Abrir carpeta en Explorador de Windows".
El archivo CAB en este caso fue generado en la carpeta Visual Studio 2008\Projects\CentigradosAFarenheit\CentigradosAFrenheitCAB\Debug, este archivo solo es necesario copiarlo en el dispositivo y ejecutarlo.
Una vez instalado es facil verificar solo ingresa un número en el Textbox y presiona "Aceptar", la salida se debe verificar en el Label3.
Espero que haya sido de tu agrado. Comenta
Etiquetas: .NET, Servicio web, Smart Device, visual basic, WSDL