Está en la página 1de 4

Aplicaciones de controlador Bluetooth en Robótica.

CAPÍTULO 7: PROGRAMACIÓN C# AVANZADA

Antes de explicar cómo hemos solucionado el problema de


comunicación con el mando y establecidas las bases en apartados
anteriores, desarrollamos aquí el entorno de programación en el
que hemos trabajado.

Este apartado pretende ayudar al lector menos familiarizado


con C#, para hacer más comprensible al lector la solución concreta
que hemos aportado. Se comentarán las características más punteras
que nos ofrece el entorno de desarrollo usado.

7.1. ¿QUÉ ES C#?

El lenguaje C#, o C Sharp, es un lenguaje de programación


orientado a objetos desarrollado y estandarizado por Microsoft
como parte de su plataforma .NET, y que después ha sido aprobado
por ISO[14].

C# deriva de C/C++, en cuanto al control de bajo nivel y


sintaxis, por otro lado se parece en ciertos aspectos a Visual
Basic, sobre todo en cuanto a la velocidad de programación y el
uso de formularios y controles visuales.
Como curiosidad, C# significa do_sostenido, ya que C
corresponde a la nota do en terminología musical anglosajona. Si
ahondamos más, se dice que el símbolo # viene de superponer las
++, indicando su descendencia de C++.
C# forma parte de la plataforma .NET, que intenta conseguir
lo mismo que Java, esto es, portabilidad de código fuente de una
máquina a otra, gracias al uso de un lenguaje y compiladores
intermedios, comunes a todos los tipos de máquinas.

7.2. EVENTOS Y DELEGADOS

Casi todas las aplicaciones Windows tienen alguna clase de


necesidad de procesamiento de eventos. Alguno de estos eventos son
genéricos, tales como el envío desde Windows de mensajes a la cola
de mensajes de las aplicaciones cuando el usuario ha interactuado

1
Aplicaciones de controlador Bluetooth en Robótica. 2

de alguna forma con la aplicación. Otros son más específicos de un


dominio, como la impresión de una factura para un pedido.

En general podemos decir que los eventos proporcionan un


medio para que una clase u objeto informe a otras clases u objetos
cuando sucede algo relevante. La clase que envía el evento el
evento recibe el nombre de editor y las clases que reciben el
evento se denominan suscriptores. Esto es, los eventos en C#
siguen el patrón de diseño de publicación/suscripción: una clase
publica un evento que puede lanzar y cualquier número de clases se
pueden suscribir a ese evento. Una vez se ha lanzado el evento, el
entorno de ejecución se encarga de notificar a cada suscriptor que
ha sucedido el evento.
En este momento entran en juego los delegados. Se trata de
otra innovación útil de C#. Se trata de realizar la misma función
que los punteros a funciones realizan en C++, pero los delegados
son objetos de memoria gestionada y de tipo seguro. De esta forma,
el entorno de ejecución garantiza que un delegado apunta a un
método válido. Por tanto, posee los benificios de punteros a
funciones pero sin ninguno de los peligros asociados a la memoria,
direcciones inválidas,...

Pues bien, el método invocado como resultado del lanzamiento


de un evento se define mediante un delegado. Los parámetros del
delegado definido de esta forma siempre son dos: el objeto que
lanzó el evento y un objeto de información del evento, que se
deriva de una cierta clase EventArgs de .NET.

Aunque veremos cómo se usan estas 2 ideas de forma más


específica en nuestro proyecto, ahora es un buen momento para
aclararlas con un ejemplo sencillo.
Esta línea declara un delegado WiimoteChangeEventHandler, con
los dos parámetros que hemos comentado:

public delegate InventoryChangeEventHandler(object source,InventoryChangeEventArgs e)

Los eventos se definen como sigue:

public event InventoryChangeEventHandler OnInventoryChangeHandler

Mediante la palabra reservada event, especificamos el


delegado y el nombre del evento. El delegado estará asociado al
método que se invocará cuando se lance el evento.
Una vez definidos, supongamos que queremos lanzar el evento.
Prestemos entonces atención a las líneas siguientes:
if(OnInventoryChangeHandler !=null)
OnInventoryChangeHandler(this, e);

2
Aplicaciones de controlador Bluetooth en Robótica. 3

En primer lugar comprobamos si el evento tiene algún


suscriptor asociado con el método OnInventoryChangeHandler. Si lo
tiene se lanza el evento, pasando como parámetros el objeto que
lanzó el evento (this, o sea, el mismo) y el objeto de informe de
de eventos.
Hemos dicho que comprobamos si el evento tiene un suscriptor,
pero, ¿cómo se hace la suscripción por parte de la clase? Se hace
de la siguiente forma:

OnInventoryChangeHandler += new InventoryChangeEventHandler(OnInventoryChange)

O sea, se añade a sí mismo a la lista de suscriptores


asociadas al delegado, así no borrar ningún suscriptor previo. El
único parámetro que se le manda al delegado es el nombre del
método que se ejecutará en caso de que se lance el evento
(recordar que el delegado actúa como puntero a función).

7.3. PROGRAMACIÓN MULTIHILO

Usar una aplicación con un único hilo de ejecución es algo


parecido a comprar en un supermercado con un único cajero[15].
Emplear un único cajero es más barato para el dueño del
supermercado y admisible por el cajero cuando los niveles de
tráfico son bajos. Imaginar un día que el supermercado anuncia un
día de ofertas y las colas al cajero empiezan a ser cada vez más
largas. Hay clientes que comienzan a enfadarse. Éste es el típico
escenario de cuello de botella, con muchos datos y un conducto por
el que tienen que pasar todos. La solución pasa por supuesto por
contratar más cajeros.
Lo que ocurre cuando hablamos de hilos de ejecución y
aplicaciones es lo mismo. El uso de multihilo permite que una
aplicación divida sus tareas de modo que puedan trabajar de manera
simultánea pero independiente entre sí para hacer el uso más
eficiente del procesador.
Sin embargo hay un pero, y es que la programación multihilo
no siempre la elección correcta para todas las aplicaciones, e
incluso en determinadas ocasiones puede ralentizar la aplicación.

Para usar programación multihilo, en C# disponemos del


espacio de nombres System.Threading y específicamente de la clase
Thread. Esta clase permite crear hilos de ejecución, así como
métodos para la gestión del ciclo de vida del hilo.

Es muy común, por ejemplo, detener un hilo de ejecución


durante una cantidad determinada de tiempo. Para ello tenemos el

3
Aplicaciones de controlador Bluetooth en Robótica. 4

método Sleep, que permite detener un hilo en ejecución un tiempo


en milisegundos. La llamada al método sólo tiene efecto si se hace
desde el hilo que queremos detener.

Otros ejemplos de funciones que nos aporta la clase Thread


son el control de prioridades, planificación, sincronización de
hilos,...

También podría gustarte