Sunday, January 21, 2007

Quickstart Threads in C#

C# soporta la ejecución paralela de código por medio de multithreading. Un thread o (hilo) es otro camino de ejecución independiente al del proceso principal (o “main” thread) que lo manda a llamar, de esta forma permite la ejecución simultanea con otro hilos.

Un programa de C# empieza con un solo hilo creado automáticamente por el CLR y el sistema operativo. Este hilo se llama “main” thread (o hilo principal) y los otros hilos que son los “worker” threads. El programa se vuelve multhi-threaded (o multi-hilos) al crease threads adicionales.

El CLR asigna a cada thread su propio stack de memoria para mantener las variables locales separadas. Por lo tanto si se hace un método que se ejecuta dos veces en dos threads distintos, entonces existirán dos instancias de las variables en dos stacks. Pero si se desea compartir data entre hilos, se puede hacer si se tiene una referencia a la misma instancia de un objeto. También se puede compartir data entre hilos utilizando campos o variables estáticas (en C# se utiliza la palabra static para definir tales variables).

El problema de compartir data entre hilos es la seguridad entre threads. Sucede los siguiente: puede ser que el thread A empiece a trabajar en las variables o recursos compartidos, cuando thread B todavía esta trabajando en ellos, lo cual afecta el resultado de thread B de una forma no deseada. Similar a lo que pasa cuando dos o mas aplicaciones clientes accesan un registro en una base de datos, definido como concurrencia, solucionado con métodos de control de concurrencia. Para solucionar este problema con los threads se necesita obtener un exclusive lock, de tal forma que el recurso compartido solo puede ser utilizado por un thread a la vez.

Después de esta breve introducción, pueden conocer mas de los threads con ejemplos y todo en esta pagina que considero (ya que me ayudo) muy practica y suficiente para trabajar con threads en C#.

Pero si no desean leer todo el contenido de la página, y desean empezar a trabajar con los threads entonces sigan leyendo. Utilizo los threads en C# para dar una interfase grafica para el usuario que responda durante procesos largos. De esta forma el thread principal Main, podrá estar respondiendo a cualquier requisición del usuario, mientras los hilos trabajan en otras tareas y ventanas.

Para empezar se debe incluir

using System.Threading;

Después de esto creamos el método estático que tendrá todo lo que deseamos correr en el hilo.

private static void metodo()

{

...

}

Si se desea utilizar argumentos, solo se podrá incluir uno. Por lo tanto si se tienen varios argumentos, se pude pasar como argumento un objeto con varias propiedades o un arreglo si todos los argumentos son de un tipo.

private static void metodo(object arg)

{

...

}

Tenemos nuestro metodo ahora a crear el thread. Para crear un thread y ejecutarlo se hace de la siguiente forma:

Thread hilo = new Thread(new ThreadStart(metodo));

Si el metodo tiene un parametro entonces lo declaramos de la siguient eforma

Thread hilo = new Thread(new ParameterizedThreadStart(metodo));

Se declara el hilo con el método que se ejecutara por en el hilo. Para iniciar el thread solo llamamos a:

hilo.Start();

Si deseamos abortar el thread entonces utilizamos Abort(). Para poner a dormir al hilo utilizamos Sleep(n) donde n es el número de segundos que deseamos que el thread duerma.

Dot Net también nos brinda una clase ayudante, BackgroundWorker en el namespace System.ComponentModel para manejar un worker thread. Esta clase nos provee las siguientes bondades:

  • Una bandera “cancel” para mandar una señal al thread de que debe terminar sin utilizar el a veces problemático Abort.
  • Un protocolo estándar para reportar progreso, completación y cancelación. Muy útil para mostrarle a un usuario como va el trabajo.
  • Manejo de excepciones
  • La habilidad de actualizar los controles en las Windows Forms del progreso o finalización del thread. También útil para mejorar la interacción con el usuario.

Algo interesante es que el hecho que BackgroundWorker maneja un pool de threads, donde los recicla en vez de estar creando nuevos threads. Entonces si se desea utilizar esta clase hacemos lo siguiente:

Declaramos el objeto

static BackgroundWorker worker = new BackgroundWorker();

Despues le agregamos los eventos a utilzar. Me parece que los eventos mas utiliados son:

DoWork: donde se programa el trabajo qe efectuara el thread

ProgressChange: donde reportamos el progreso de trabajo a un control como ser una progressbar (barra de progreso).

RunWorkerCompleted: que se encarga de ejecutar lo que queramos cuando termina el thread de ejecutarse.

Estos dos últimos eventos son muy importantes para mejorar la interactividad con el usuario y para comunicarse con el main thread, debido que no es permitido que los hilos se comuniquen entre si, ósea “cross thread comunication” no es permitido.

Así adicionamos los métodos que se ejecutaran en los eventos:

bw.DoWork += new DoWorkEventHandler(bw_DoWork);

bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);

bgWorkerPrintBLs.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

donde los metodos en los parentesis se definen de la siguiente forma:

private void bw_DoWork(object sender, DoWorkEventArgs e)

{

//trabajo del thread

}

void bw_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)

{

//intereaccion con el progress bar control

progressBar.Value = e.ProgressPercentage;

}

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

//cuando el thread termina puede ser un messagebox o mensaje

MessageBox.Show(“fin”);

}

Finalmente para inicar el este worker thread haemos los siguiente:

bw.RunWorkerAsync();

Conclusion:

Este es un quickstar para threads en C# lo cual es muy probable que se tenga que utilizar en aplicaciones para Windows que no dejen de responder visualmente cuando les toca ejectuar un proceso de varios segundos. Pero esta es solo la punta de iceberg y el ebook (y fuente teorica para este post) que lei para iniciar con los threads en C# es una buen inicio. Alli tambien encontraran sobre sincronizaciones de threds, seguridad, comunicación entre threads y otra informacion teorica y practica muy util.

Wednesday, January 10, 2007

iPhone de Apple Inc comparte touch screen y nombre

Bueno, no duro mucho sin crear controversia el nuevo producto de Apple Inc. (ya no es Apple Computer Inc). iPhone no es un nombre registrado por Apple, sino por Cisco y es parte de una linea de productos de su división Linksys. Por lo tanto Jobs anuncia el nuevo producto bajo nombre iPhone, entonces Cisco lanza su ataque legal contra Apple Inc.

Bueno ese es un pequeño problemita que no dejara de vender los iPhones, aunque lo que si me parece interesante es que su tecnología del touch screen dice que esta patentizado. Bueno un amigo Orlando Flores me paso un video muy interesante donde se muestra que un touch screen similar al de iPhone, incluso va mas allá, pareciéndose a lo que vimos en una película hace unos años.

Las aplicaciones que se muestran son aun más interesantes y creo que van en pro de un futuro sin límites para el UI para todos y no en pro del “Inc.”

iPhone: el tres en uno

Ayer 9 de enero del 2007 en la expo y conferencia anual de Apple llamada MacWorld, Steve Jobs en su keynote de entrada introdujo al mundo un nuevo ipod con touch screen y Wide screen, un teléfono revolucionario y un comunicador de Internet que quiebra la brecha de los demás. Estos tres dispositivos, son uno solo llamado el iPhone. Lo llama una reinvención del teléfono, por el hecho que sus funciones y sus maravillas y además de la facilidad de utilizar y porque es mucho mas “inteligente” que los smartphones.

Puedo describir y resumir lo que Jobs dijo en el keynote pero creo que es mejor que cada quien lo vea. El video del keynote lo pueden encontrar en este link. Ustedes ven esto y es increíble lo que se podrá hacer con este dispositivo. Osea la User Interfase es increíble lo innovador y fácil que es de utilizar. A mi no me gustan mucho los productos de Apple pero, yo quiero un iPhone, es así de bueno….

Algo interesante de este keynote es la fanaticada de Apple, el público esta metido de lleno a la charla. Se comen cualquier cosa que Steve Jobs dice, lo aplauden, gritan se rien. No solo es el hecho de estar allí, todo ellos comparten la emoción de Steve Jobs, todos ellos están emocionados, en realidad vale la pena ver el keynote, vale la pena vivirlo (si se puede) es una comunión. Véalo como lo que pasa en partido de su deporte favorito en ese momento se olvidan de la guerra de Irak, de la pobreza, del hambre de sus problemas y cuentas por cobrar. Así de hipnotizante es el keynote y el iPhone.

Pero volviendo a la realidad hay ciertas cosas que me pregunto. ¿Por qué no tiene expantion slot para memoria? ¿Qué tan durable será la pantalla? ¿Si los parches para mac OS X para MACS también se tiene que aplicar a iPhone? ¿Cuánto cuesta? ¿Cunado puedo tener uno?

Pues se algunas respuestas gracias a un poquito de investigación. El iPhone sale hasta junio y costara $499 el de 4 gigas y $599 el de 8 gigas. No tiene expantion slot y no se porque, talvez no es tan necesario y también para obligar a las personas a solo utilizar iTunes para pasar data. Pueden ver un resumen del iPhone en este video de cnet.

Es un dispositivo muy interesante y vale la pena considerar si se tiene el dinero, lo cual me trae al dilema si es un lujo o en realidad es una necesidad ya que nos facilita la existencia.

Wednesday, January 03, 2007

Nuevo año… ¿pero todo sigue igual?

Nuevo año, nuevos sueños, nuevas promesas, nuevas tragedias, nuevo de todo. Pero al final son ocurrencias de nuestras vidas que no importan el día, hora u ocasión, todo puede pasar.

El marco de tiempo que define el año 2006 estuvo lleno de protagonistas deportistas, políticos, criminales, artísticos, etc. acaparando la atención del mundo. Como todos los fin de años se hace un recuento de lo bueno, lo malo y horrible sobre eventos y las personas que influenciaron nuestras vidas que irónicamente no conocemos.

Pasa el recuento y los recuerdos de todo lo del año y de repente nos damos cuenta, “hey y que hay de nosotros”. Así, por un momento olvidamos todo al mundo y nos concentramos en “yo” el centro de universo, en nuestras metas para el nuevo año, que por marzo se pierden en el olvido, igual que los caminos y nuestros amores. Nos hacemos tantas metas y promesas que pareciera que fuéramos políticos tratando de ganar nuestro propio voto. Y aparentemente con la creciente población de individuos con síndromes de déficit de atención (hoy en días la mitad de las personas tienen algún déficit de atención) se repite y repite mas este fenómeno de olvidar las metas y substituirla por problemas insignificantes como: que voy a ponerme hoy, me dejo mi novio o novia, no baje mis 5 libras, deudas espantosas de tarjeta de crédito, nuevos gritos de la moda, el precio del combustible, la selección de mi país, el ultimo escándalo de un presidente, etc. Ósea todo aquello que nos acapara atención y que es noticia, sea de dominio público o de nuestras vidas personales.

Puedo hacer un recuento de todo lo importante que paso, las tendencias que los expertos concluyen, presentando mi opinión sobre algunos temas (aclaro yo no soy un experto, solo tengo un punto de vista mió y solo mió) puedo tratar de predecir las finanzas, innovaciones tecnológicas, etc. Pero en realidad son trivialidades, que carecen de sustancia humana y el valor incomparable de nuestras vivencias y experiencias, que en contraste, no son triviales. Se puede discutir la trivialidad del desarrollo de una tecnología o implementación masiva de una idea o prototipo que cambia nuestro vivir diario, como seria Internet inalámbrica gratis en toda una ciudad, la implementación exitosa de biodisel en Honduras, un virus que provoco la congestión del Internet por 34 minutos o cualquier evento deportivo mundial o de atención mundial.

Nuestras vivencias, que superan a los fenómenos de atención mundial, son pequeñeces muy densas en materia humana y no globos inmensos llenos de aire. Es difícil darse cuenta de lo simplemente bello y de valor imaginable que tiene estos eventos y experiencias: otro año que un matrimonio siguió juntos con sus hijos, otro año que sus hijos siguen firmes en no consumir drogas, otro año donde una madre soltera saca adelante a sus hijos, otro año donde una persona prefirió ayudar mensualmente a un necesitado (económico y emocional) en vez de gastar mensualmente ese dinero en mudadas de ropa sobrevaluadas para estar al “grito de la moda (y por cierto porque pagar por algo que solo dura el tiempo de un grito)”, la euforia por los niños que no murieron de una simple gripe o diarrea, incluso de niños también aprendieron a leer, escribir o utilizar una computadora.

Pero no todo es color de rosa, engrandecimiento de supuestas tragedias como perder una final de un evento deportivo, no ver un programa de televisión favorito, manchar nuestra camisa favorita, el fin de un noviazgo, bancarrota de una empresa (aunque esta ultima puede estar a discusión) no se comparan a sucesos como abortos innecesarios se pudieron prevenir, cuantos se dejo de aprender por estar jugando video juegos, ver MTV o hablar por teléfono, cuantos animales fueron brutalmente masacrados. Sumándole a las personas inocentes que fueron brutalmente asesinados o que sufrieron del hambre, el frió, la pobreza emocional, los suicidios…

Allí esta lo importante, eso es lo que se debe celebrar, llorar y sufrir, lo que ocurren en nuestras vidas, en nuestras familias, en nuestras relaciones mas intimas. Cuesta darse cuenta de que “no todo lo que brilla es oro” y que la leche derramada no merece ni una lagrima o robarnos una sonrisa. Al final puede ser que solo sean palabras escritas para llenar un blog, o son el resultado de extensiva meditación, incluso una rafa de pensamientos en un trance ideológico. No importa que sea esto, lo que si es importante es que sin interesar la hora, el día, el evento, debemos reflexionar continuamente y no perder el enfoque de que es trascendental y que importancia se le debe dar. Y lo difícil esta en no consumirnos y convertir nuestra vida en una vida llena de trivialidades de las cuales ni somos dueños, mas bien reflexionar y crear metas que progresivamente se convertirán en escalones de este “viaje” que llamamos vida.