threads , duda

Iniciado por omar_cdg, 28 Agosto 2015, 22:15 PM

0 Miembros y 2 Visitantes están viendo este tema.

omar_cdg

Hola amigos,  tengo una pequeña duda... a ver si alguien me puede ayudar.
Si tengo un programa que consta de dos clases.  Una es la GUI y otra la clase funcional a esa gui,  digamos. Que a su vez tiene una clase interna.
. Cómo tendria que hacer para colocar cada una de ellas en un hilo diferente.

El Benjo

Lo que se ejecuta en hilos distintos no son las clases, son las funciones de esas clases. Es decir que todo el tiempo tu aplicación ejecutará las funciones de cualquier clase en un hilo principal que es con el que comienzas. Cuando creas un nuevo hilo lo haces apuntando el hilo a una función y después ejecutas éste.

Quizá estés un poco confundido sobre la programación multihebra y su verdadero uso. Así que te recomiendo dar un repaso al concepto de programación multihebra primero.

También, dinos qué necesitas ejecutar en otro hilo y por qué necesitas ejecutarlo en otro hilo. Esto último es necesario siempre que programamos aplicaciones multihebra.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

omar_cdg

Hola, gracias por responder. Tengo algunas aplicaciones que las he creado de la siguiente manera:
una clase para lo que es la interface grafica del programa y otra para la parte funcional del mismo.
Por ejemplo una de mis aplicaciones es un programa que muestra tarjetas de juegos de azar(prode loto quini etc, segun se elija). Pues bien la clase principal de, por ejemplo, prode es la gui donde solo armo la tarjeta
en otra clase hago toda la parte funcional (resultado de partidos, dobles).
He leido en mis libros sobre los threads y he entendido que mejoran mucho el rendimiento de un programa, ya que se ejecutan independientemente. Pues entonces queria saber como puedo yo aplicar esos hilos en mis apps. Y sí, estoy confundido al respecto. Gracias

El Benjo

En efecto, lo que dice tu libro acerca de los hilos o threads es cierto, estos potencian mucho las aplicaciones, especialmente en procesadores multinucleo. Pero, los hilos unicamente son útiles en dos escenarios (creo, que alguien más me corrija si me equivoco) cuando tenemos un procesador con más de un núcleo y nuestro algoritmo puede hacer uso de todos los núcleos a la vez; y cuando debemos ejecutar una tarea en segundo plano por un tiempo prolongado y al mismo tiempo debemos ejecutar otras tareas por otro tiempo indefinido (tal es el caso de la GUI).

Los hilos funcionan de la siguiente manera:

-->Tienes un hilo principal
-->Creas un nuevo hilo con la dirección del código que ejecutará tu nuevo hilo (es decir, el método o función)
-->Lanzas el nuevo hilo.

A partir de este punto tu aplicación ya está corriendo dos hilos simultaneamente, es decir que ambas piezas de código se están ejecutando y tu segundo hilo terminará cuando llegue al final de tu función. Los hilos por lo general se usan, como te he dicho cuando tienes un código que demora mucho en ejecutarse y aún quieras que el usuario pueda emitir comando a la aplicación (un ejemplo de esto sería terminar la operación, como cuando presionas el botón de cancelar).

Debes tener en cuenta que los hilos no tienen un valor de retorno en el sentido tradicional de la palabra, pues al momento de que tú lanzar el hilo el flujo normal de tu programa seguirá sin esperar a que termina la función que estás ejecutando en el otro hilo que acabas de lanzar.

Te dejo el siguiente video que subí hace tiempo acerca de creación de hilos en C# y otro video de un caso práctico de uso en una aplicación:

https://youtu.be/GgyVTzXH804
https://youtu.be/vsd4SkAA8e4

Y uno más de multithreading en java

https://www.youtube.com/watch?v=ZxzCI3PAZwo

Por desgracia no encontré ningún video sobre los conceptos de la programación multihebra. Espero hacer uno pronto y subirlo.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

omar_cdg

Muchas gracias por tu tiempo y material, será apreciado. Saludos

Ur1cchio

Voy a corregir algo, tenia entendido que los threads no aprovechan el multiprocesamiento, no es posible hacer que dos hilos o mas, pertenecientes a un mismo proceso corran en núcleos o procesadores diferentes, es mas, los hilos para el sistema operativo son transparentes, y el único que se encarga de planificarlos es el mismo proceso en el cual están ejecutando. El uso de threads no mejoran la performance de la aplicación, y a veces suelen causar problemas

Saludos

El Benjo

Lo que mencionas es falso, una aplicación puede ejecutar dos hilos (pertenecientes al mismo proceso) en núcleos diferentes. E incluso puedes hacer las pruebas ejecutando un bucle que realice un trabajo intensivo; si tu PC tiene dos núcleos y ejecutas la función en un sólo hilo obtendrás una carga del procesador del 50% en el administrador de tareas y si ejecutas esa misma función en dos o más hilos obtendrás una carga del 100%.

Quizá lo que quisiste decir es que un mismo hilo sólo puede ejecutarse en un núcleo.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

Ur1cchio

La verdad si te digo te miento, yo solo opino lo que estoy aprendiendo este cuatrimestre en la Universidad... Probablemente este entendiendo mal, o me este expresando mal. Pero aun asi, el único ente que se encarga de planificar en que momento que proceso va a usar un núcleo o procesador como quieran llamarlo es el sistema operativo. Es posible que un proceso en un cierto tiempo este " usando " dos núcleos aun así los hilos de un proceso comparten los mismos recursos y el mismo mapa de direcciones. A no ser que sean super independientes es muy poco probable que corran realmente en paralelo( solo es una suposición en base al conocimiento que tengo ).

Insisto, no lo se realmente. Y no estoy discutiendo, si alguien puede aportar con alguna bibliográfia seria genial.

Saludos!

El Benjo

#8
Bueno, te voy a plantear la prueba que hice una vez y los resultados que obtuve y de ahí deduces lo que quieras.

Creé una función dentro de mi aplicación que hacía 1,000 millones de sumas.
Primero lancé esa función en mi hilo principal y obtuve 2.4 segundos en tiempo de ejecución.
Después lancé esa función en un segundo hilo y la ejecuté al mismo tiempo dentro de mi hilo principal (o sea el doble de operaciones de suma) y el resultado en tiempo de ejecución fue de 2.7 segundos.

Como vez, el tiempo es casi el mismo usando dos hilos (pues mi procesador tiene dos núcleos) la diferencia es que hice el doble de operaciones por segundo.

Lo que mencionas sobre los recursos y el hecho de que el sistema operativo sea el que asigna un tiempo a cada hilo es irrelevante, pues al haber más de un núcleo siempre va estar un hilo en cada uno de los núcleos.

Ponte a pensar que si lo que dijeras es cierto, el haber inventado los procesadores con más de un núcleo no serviría de nada. Saludos y espero que los números hayan hablado. De todas formas si no me crees, has la prueba por ti mismo.

EDITADO:

https://es.wikipedia.org/wiki/Hilo_de_ejecuci%C3%B3n

En el enlace anterior ve a donde dice "Hilos a nivel de núcleo (KLT)"

Aquí también, al inicio, puedes leer acerca de como funciona el cambio de hilos y lo que mencionabas sobre los recursos, y de hecho, te dicen que esto es una ventaja.

"En muchos de los sistemas operativos que dan facilidades a los hilos, es más rápido cambiar de un hilo a otro dentro del mismo proceso, que cambiar de un proceso a otro. Este fenómeno se debe a que los hilos comparten datos y espacios de direcciones, mientras que los procesos, al ser independientes, no lo hacen."
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

omar_cdg

Hola, tengo entendido que cada hilo corre en un nucleo diferente, es por eso que los procesadores modernos pueden correr los programas  de manera mas rapida eficiente si las apps cuentan con varios threads