Threads

15/02/2005 - 22:33 por José Miguel Torres | Informe spam
Hola, tengo un problemita, tengo que ejecutar un proceso
que es algo pesado (3 o 4 segundos) varias veces, en un
siclo for(), como cada iteración esta tardando mucho,
pense en utilizar hilos, pero no conosco mucho de esto,
creen que si tengo que iterar 6 veces sobre un mismo
proceso y esperar 20 segundos por ejemplo, con 6 hilos
trabajando el tiempo de espera se verá reducido??? Y de
ser así como podría hacer para capturar la salida de cada
uno de los hilos? Cada hilo lo que hará será convertir un
array de bytes a una imagen jpg, entonces cada hilo deberá
recibir el array y devolverme la imagen. Bueno mi consulta
es si vale la pena investigar esto de los hilos para
obtener las salidas más rápido o si alfinal y al cabo será
lo mismo. Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Raziel
16/02/2005 - 04:24 | Informe spam
Bueno segun mi punto de vista si seria conveniente que
investigaras acerca de Threads ya que tal como lo tienes
ahora pues trabaja con un solo thread, con multiples
thrads podrias disminuir ese tiempo.

Hay ventajas y desventajas en el manejo de threads, te
dejo estos links para que los puedas leer y tengas un
panorama mas amplio:

http://msdn.microsoft.com/library/default.asp?
url=/library/en-us/cpguide/html/cpconthreadsthreading.asp

http://msdn.microsoft.com/library/default.asp?
url=/library/en-us/csref/html/vcwlkthreadingtutorial.asp

http://www.c-sharpcorner.com/Multithreading.asp

Saludos
Hola, tengo un problemita, tengo que ejecutar un proceso
que es algo pesado (3 o 4 segundos) varias veces, en un
siclo for(), como cada iteración esta tardando mucho,
pense en utilizar hilos, pero no conosco mucho de esto,
creen que si tengo que iterar 6 veces sobre un mismo
proceso y esperar 20 segundos por ejemplo, con 6 hilos
trabajando el tiempo de espera se verá reducido??? Y de
ser así como podría hacer para capturar la salida de


cada
uno de los hilos? Cada hilo lo que hará será convertir


un
array de bytes a una imagen jpg, entonces cada hilo


deberá
recibir el array y devolverme la imagen. Bueno mi


consulta
es si vale la pena investigar esto de los hilos para
obtener las salidas más rápido o si alfinal y al cabo


será
lo mismo. Muchas gracias.
.

Respuesta Responder a este mensaje
#2 Guillermo Jimenez
16/02/2005 - 14:19 | Informe spam
Para optimizar un programa mediante la utilizacion de
threads se necesita que no hayan co-dependencias entre la
labor hecha en cada thread.

O sea

1) Que el thread1 no dependa en nada de lo que hace el
thread2.

2) Que el thread1 y el thread2 no tengan puntos de
contencion entre si, o sea que no necesiten acceso a la
misma variable global u otro recurso (bases de datos,
impresoras, video, etc) compartido.

Ambos requisitos son dificiles de alcanzar y de ahi viene
el grado de dificultad en el uso de hilos.

En cuanto a recibir un valor de retorno (el archivo JPG),
me parece que lo mejor que podes hacer es simplemente
salvarlo dentro del hilo mismo (disco o base de datos) ya
que ni ThreadStart ni el ThreadPool aceptan funciones
(operaciones que retornan un valor). Por definicion tenes
que usar metodos declarados con la palabra void.

Si usas 'new Thread' que requiere ThreadStart entonces
tenes que manejar los puntos de contencion vos mismo. Si
usas el threadpool (lo que recomiendo) podes
despreocuparte de todo.

Algo mas: SQL Server es 'ThreadSafe' lo que significa que
hace su propia administracion de hilos por lo que si
salvas el jpg a una base de datos no tenes que preocuparte
mucho tampoco.

Guillermo Jimenez
Lead Technical Architect
SOA Consulting, LLC
Respuesta Responder a este mensaje
#3 Octavio Hernandez
16/02/2005 - 17:08 | Informe spam
JM,

Si tu programa tiene necesariamente que esperar de forma síncrona porque las
seis imágenes se generen para seguir adelante, entonces creo que no vale la
pena que investigues hacerlo con hilos. Piensa que de todos modos a cada
hilo le hará falta el mismo tiempo para generar su imagen (un hilo no puede
hacer que la CPU o el acceso a memoria se aceleren, ¿no?), y además el
sistema consumirá un tiempo adicional en lo que llaman el "context
switching" (cambio de contexto de ejecución para pasar de un hilo a otro).

Razones por las cuales valdría la pena considerar los hilos:
a) si quieres que el programa vaya avanzando en las seis imágenes en
paralelo (por ejemplo, para irlas mostrando en seis ventanitas en la medida
en que se van generando). Aquí los hilos son sencillamente la herramienta a
utilizar.
b) si quieres que el usuario pueda ir haciendo otra cosa mientras se generan
las imágenes. En ese caso tendrías la opción de tener siete hilos (el
principal, que atiende a la intefaz de usuario, y uno para cada una de las
imágenes), o sólo dos hilos (el principal y otro que genera las seis
imágenes secuencialmente).

Slds - Octavio

"José Miguel Torres" escribió en el mensaje
news:086101c513a5$ee6d76d0$
Hola, tengo un problemita, tengo que ejecutar un proceso
que es algo pesado (3 o 4 segundos) varias veces, en un
siclo for(), como cada iteración esta tardando mucho,
pense en utilizar hilos, pero no conosco mucho de esto,
creen que si tengo que iterar 6 veces sobre un mismo
proceso y esperar 20 segundos por ejemplo, con 6 hilos
trabajando el tiempo de espera se verá reducido??? Y de
ser así como podría hacer para capturar la salida de cada
uno de los hilos? Cada hilo lo que hará será convertir un
array de bytes a una imagen jpg, entonces cada hilo deberá
recibir el array y devolverme la imagen. Bueno mi consulta
es si vale la pena investigar esto de los hilos para
obtener las salidas más rápido o si alfinal y al cabo será
lo mismo. Muchas gracias.
Respuesta Responder a este mensaje
#4 Kravek
16/02/2005 - 19:06 | Informe spam
Creo que no todo lo que te han dicho es cierto...

1º) Si tienes procesadores con HiperThreading: en este caso se aprovecha
mejor el HT trabajando en paralelo que si un solo hilo pretende usar el HT
2º) Mientras una tarea está realizando una operación de E/S o está bloqueada
en espera de algún evento se podría estar ejecutando otra (por ejemplo según
se está grabando en disco duro una imagen)
3º) Procesos interdependientes SÍ se pueden lanzar en paralelo si bien hay
que establecer zonas de exclusión mutua, mirar su dependencia, evitar la
inanición y el interbloqueo No es fácil pero se puede hacer
4º) Si tu ordenador es multiprocesador

En resumen, creo que te puede venir muy bien usarhilos y si me dices que son
6 imágenes a 2 segundos por imagen (total 12 segundos) quizás te baje a 10 o
a 9 segundos el tiempo total, en el peor de los casos como te ha dicho
Octavio conseguirias mayor dinamismo aunque no redujeras el tiempo.

También te diría qu investigaras y mucho sobre concurrencia porque según
como lo implementes puedes conseguir mejor o peor resultado

"Octavio Hernandez" escribió en el mensaje
news:
JM,

Si tu programa tiene necesariamente que esperar de forma síncrona porque
las seis imágenes se generen para seguir adelante, entonces creo que no
vale la pena que investigues hacerlo con hilos. Piensa que de todos modos
a cada hilo le hará falta el mismo tiempo para generar su imagen (un hilo
no puede hacer que la CPU o el acceso a memoria se aceleren, ¿no?), y
además el sistema consumirá un tiempo adicional en lo que llaman el
"context switching" (cambio de contexto de ejecución para pasar de un hilo
a otro).

Razones por las cuales valdría la pena considerar los hilos:
a) si quieres que el programa vaya avanzando en las seis imágenes en
paralelo (por ejemplo, para irlas mostrando en seis ventanitas en la
medida en que se van generando). Aquí los hilos son sencillamente la
herramienta a utilizar.
b) si quieres que el usuario pueda ir haciendo otra cosa mientras se
generan las imágenes. En ese caso tendrías la opción de tener siete hilos
(el principal, que atiende a la intefaz de usuario, y uno para cada una de
las imágenes), o sólo dos hilos (el principal y otro que genera las seis
imágenes secuencialmente).

Slds - Octavio

"José Miguel Torres" escribió en el mensaje
news:086101c513a5$ee6d76d0$
Hola, tengo un problemita, tengo que ejecutar un proceso
que es algo pesado (3 o 4 segundos) varias veces, en un
siclo for(), como cada iteración esta tardando mucho,
pense en utilizar hilos, pero no conosco mucho de esto,
creen que si tengo que iterar 6 veces sobre un mismo
proceso y esperar 20 segundos por ejemplo, con 6 hilos
trabajando el tiempo de espera se verá reducido??? Y de
ser así como podría hacer para capturar la salida de cada
uno de los hilos? Cada hilo lo que hará será convertir un
array de bytes a una imagen jpg, entonces cada hilo deberá
recibir el array y devolverme la imagen. Bueno mi consulta
es si vale la pena investigar esto de los hilos para
obtener las salidas más rápido o si alfinal y al cabo será
lo mismo. Muchas gracias.

Respuesta Responder a este mensaje
#5 Kravek
16/02/2005 - 19:13 | Informe spam
Otra cosa también te podría interesar mirar la algoritmia del proceso tanto
en concurrente como en paralelo y mejor dicha algoritmia

Si el proceso tiene tiempo cuadrático y lo rebajas a linea eso acelera
muchiiiisimo más que la concurrencia;)

"Kravek" <rubengARROBAkailea4.net> escribió en el mensaje
news:
Creo que no todo lo que te han dicho es cierto...

1º) Si tienes procesadores con HiperThreading: en este caso se aprovecha
mejor el HT trabajando en paralelo que si un solo hilo pretende usar el HT
2º) Mientras una tarea está realizando una operación de E/S o está
bloqueada en espera de algún evento se podría estar ejecutando otra (por
ejemplo según se está grabando en disco duro una imagen)
3º) Procesos interdependientes SÍ se pueden lanzar en paralelo si bien hay
que establecer zonas de exclusión mutua, mirar su dependencia, evitar la
inanición y el interbloqueo No es fácil pero se puede hacer
4º) Si tu ordenador es multiprocesador

En resumen, creo que te puede venir muy bien usarhilos y si me dices que
son 6 imágenes a 2 segundos por imagen (total 12 segundos) quizás te baje
a 10 o a 9 segundos el tiempo total, en el peor de los casos como te ha
dicho Octavio conseguirias mayor dinamismo aunque no redujeras el tiempo.

También te diría qu investigaras y mucho sobre concurrencia porque según
como lo implementes puedes conseguir mejor o peor resultado

"Octavio Hernandez" escribió en el mensaje
news:
JM,

Si tu programa tiene necesariamente que esperar de forma síncrona porque
las seis imágenes se generen para seguir adelante, entonces creo que no
vale la pena que investigues hacerlo con hilos. Piensa que de todos modos
a cada hilo le hará falta el mismo tiempo para generar su imagen (un hilo
no puede hacer que la CPU o el acceso a memoria se aceleren, ¿no?), y
además el sistema consumirá un tiempo adicional en lo que llaman el
"context switching" (cambio de contexto de ejecución para pasar de un
hilo a otro).

Razones por las cuales valdría la pena considerar los hilos:
a) si quieres que el programa vaya avanzando en las seis imágenes en
paralelo (por ejemplo, para irlas mostrando en seis ventanitas en la
medida en que se van generando). Aquí los hilos son sencillamente la
herramienta a utilizar.
b) si quieres que el usuario pueda ir haciendo otra cosa mientras se
generan las imágenes. En ese caso tendrías la opción de tener siete hilos
(el principal, que atiende a la intefaz de usuario, y uno para cada una
de las imágenes), o sólo dos hilos (el principal y otro que genera las
seis imágenes secuencialmente).

Slds - Octavio

"José Miguel Torres" escribió en el mensaje
news:086101c513a5$ee6d76d0$
Hola, tengo un problemita, tengo que ejecutar un proceso
que es algo pesado (3 o 4 segundos) varias veces, en un
siclo for(), como cada iteración esta tardando mucho,
pense en utilizar hilos, pero no conosco mucho de esto,
creen que si tengo que iterar 6 veces sobre un mismo
proceso y esperar 20 segundos por ejemplo, con 6 hilos
trabajando el tiempo de espera se verá reducido??? Y de
ser así como podría hacer para capturar la salida de cada
uno de los hilos? Cada hilo lo que hará será convertir un
array de bytes a una imagen jpg, entonces cada hilo deberá
recibir el array y devolverme la imagen. Bueno mi consulta
es si vale la pena investigar esto de los hilos para
obtener las salidas más rápido o si alfinal y al cabo será
lo mismo. Muchas gracias.





Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida