| |  |  | Miembros: Mensajes: Temas: Online: Ultimo Miembro: | | |  | | |
 | 
08-09-2005, 22:55:49
| | Gran Participación en el Foro | | Registrado: abr 2004 Ubicación: Sevilla Posts: 250
| | Thread y collection Hola alguien a usado varios thread en un código. Estoy intentado tener una colleción de objetos que contiene thread pero pierdo el control de ellos.
lo hago así.
public structure nodo
public hilo as thread
public imagen as picturebox
end structure
Luego voy creando variables de tipo nodo y las agrego a un collection.
Cuando intento recuperar un nodo no consigo saber el estado del thread.
¿Alguna idea?
:smt013 :smt013 | 
09-09-2005, 06:01:52
| | Moderador | | Registrado: dic 2002 Ubicación: Madrid Posts: 4.271
| | Desconozco VB.NET, pero un Thread es una clase que se instancia y se ejecuta simultáneamente con otras de su misma clase para realizar diferentes acciones al mismo tiempo. Los hilos que tengas en funcionamiento los puedes arrancar start(); detener stop(); y si usan procedimientos críticos, éstos deben estar sincronizados. lo que no creo es que un proceso lo puedas almacenar en una estructura de datos.
Si no encuentras la solución te puedo indicar como se manipulan en JAVA o incluso en C# que será más parecido a VB. | 
09-09-2005, 07:34:33
| | Gran Participación en el Foro | | Registrado: abr 2004 Ubicación: Sevilla Posts: 250
| | Almacenar si que puedo, lo que pasa es que no se como identificar cual esta corriendo y cual no.
Ejemplo,
Tengo 10 variables de tipo nodo en el collection, cada una con un objeto de tipo thread a nothing (no los he inicializado)
Tomo el primero lo inicializo y lanzo el thread (este funciona sin problemas), pero si mientras que esta funcionando hago un bucle que repase los 10 nodos no se identificar cual esta en funcionamiento, he probado con ThreadState pero me da una excepcion en todos los casos. | 
09-09-2005, 11:48:07
| | Moderador | | Registrado: dic 2002 Ubicación: Madrid Posts: 4.271
| | No sé si será por la misma razón pero al menos en JAVA los objetos de una clase (Estructura en este caso), conviene ponerlos como private. Si además los insertas en una colección de datos, como pueden contener cualquier cosa, es necesario hacer un casting, es decir, poner delante de la recuperación del objeto, el tipo al que pertenece.
miNuevoNodo = (nodo)hashcollect.get(key)
Pruébalo y en todo caso si me pones el código trato de probarlo en VB.NET | 
09-09-2005, 16:07:17
| | Gran Participación en el Foro | | Registrado: abr 2004 Ubicación: Sevilla Posts: 250
| | Lo del casting lo he probado con la instrucción ctype. Pero sigue sin funcionar, bueno seguia sin funcionar. Lo he conseguido controlar pero de una forma extrañisima y no se si me dará problemas en un futuro. Por ahora va.
Lo explico por si alguien puede explicarme que pasa:
Lo que estoy haciendo es un programa que espera la llegada de ficheros en a un directotio, en esos ficheros lo que hay es el nombre de una maquina y la referencia de una acción. Bien pues el programa debe de recojer esos ficheros leerlos y ejecutar las acciones sobre esos equipos (basicamente es recogida y envio de ficheros a equipos de una red) lo tengo configurado para que pueda lanzar 10 Hilos, cada hilo lleva asociado una imagen para que cuando se este ejecutando un hilo se muestre una imagen en rojo y cuando no se ponga en verde.
Vale...
Pues como controlo los hilos? como se cual se queda libre para volver a lanzarlo con otro comando?.
Pues pense en una coleción de objetos Nodo formados por otros dos objetos un picturebox y thread.
El problema es que cuando me llegan dos ficheros por ejemplo asigno el primer comando al primer hilo lueg tendría que hacer que otro hilo que estuviese parado ejecutase lo que me llega en el segundo fichero. He probado poniendo una variable booleana en nodo que identifique cuando esta parado un hilo, pero no funciona, he probado tambien en usar ThreadState pero me da una excepcion , aun sabiendo que se esta ejecutando, al final sabes como lo controlo????
Con la propiedad name del picture box. Mientras que el hilo se ejcuta le pongo una marca que el propio hilo quita cuando termina.
raro raro raro.
Pues eso si alguien sabe de hilos que hable ahora o calle para siempre.
Saludos. | 
09-09-2005, 17:44:39
| | Moderador | | Registrado: dic 2002 Ubicación: Madrid Posts: 4.271
| | Como te he comentado anteriormente me extraña el hecho que lo pongas en una estructura de datos y además que generes 10 hilos estáticos, aunque no hagan nada. Te cuento la arquitectura en C#
//Primero importas los paquetes necesarios
using System;
using System Threading;
//Clase que se ejecuta como hilo independiente
class tEquipos {
public Thread thr;
//constructor
public tEquipos(string nombre) {
thr = new Thread(new ThreadStart(this.run));
thrd.Name = nombre;
//Lo arrancamos
thrd.start();
}
//Entrada al proceso
void run() {
//Aquí el código que atiende el equipo que se conecta
//cuando este código inaliza su ejecución, el hilo muere
//y su propiedad IsAlive se pone en false.
/* Dejar que otros hilos se ejecuten */
sleep(500);
}
}
En cualquier parte del código puedes implementar.
tEquipos nuevoThread = new MiThread("<equipo atendido>");
tantas veces como necesites sin que por ello sea necesario que declares un array de 10 inicialmente.
El error al consultar el estado debe sucederte porque no se está ejecutando. | 
09-09-2005, 18:10:41
| | Gran Participación en el Foro | | Registrado: abr 2004 Ubicación: Sevilla Posts: 250
| | Es muy parecido a como lo he hecho en vb.net . Pero .... que pasaría si lanzas un hilo, que por ejemplo hace parpadear una imagen, y luego le preguntas con el isAlive y te da una excepción diciendo que ese objeto esta a nothing??? pero sigues viendo parpadear la imagen....
Pues eso es lo que me pasaba.
El motivo de usar una colleción es por que no se cuantos hilos voy a tener (entre otras cosas depende de lo que quiera mi jefe, y ese cambia de opinion mas gil de entrenadores) y es la mejor forma que he encontrado para evitar tener que estar redimensionando un array.
Al final ya te digo la unica forma de saber si un hilo se estaba ejecutando era poner al principio de ese run() una marca en el nombre del picturebx y al final quitarla.
No se, pero de esa forma funciona perfectamente. | 
09-09-2005, 23:05:18
| | Moderador | | Registrado: dic 2002 Ubicación: Madrid Posts: 4.271
| | No duso que te funcione, pero preciamente la 'enjundia' de los MultiThread es que se creen y destruyan al tiempo que se necesitan, entonces no comprendo muy bien que persistas en incluirlos en un array.... Si precisamente es lo más dinámico que existe en su concepto, incluso puedes sincronizar varios hilos para que no ejecuten simultáneamente cosas que pueden alterar la integridad de los cálculos o datos. | 
09-09-2005, 23:35:24
| | Gran Participación en el Foro | | Registrado: abr 2004 Ubicación: Sevilla Posts: 250
| | Llevas razon en cuanto que podría hacerlo para ir creando los nodos conforme los necesite. (Creo que sera la segunda versión del programa). Pero si que necesito tener el maximo numero de hilos corriendo a la vez (Cuando me haga falta) ese numero lo ire ajustando dependiendo del rendimiento de la maquina.
Gracias por tu interes Acalanto. | 
11-09-2005, 22:35:03
| | Moderador | | Registrado: dic 2002 Ubicación: Oviedo - Asturias Posts: 1.251
| | Que tu estés viendo parpadear la imagen no quiere decir que no haya terminado el hilo, cosa que sí puede haber hecho aunque todavía no le "ha dado tiempo" a parar el parpadeo. Te recuerdo que los hilos entran y salen del procesador sin haber terminado las tareas pendientes, ya que se les termina "su tiempo".
Igualmente te digo lo mismo que Leonardo, yo tampoco entiendo el porqué incluirlos en una colección.
:smt004 | | Herramientas | | | | Desplegado | Mode Lineal |
Normas de Publicación
| no Puedes crear nuevos temas no Puedes responder a temas no Puedes adjuntar archivos no Puedes editar tus mensajes Código [IMG] está habilitado Código HTML está deshabilitado | | | La franja horaria es GMT. Ahora son las 20:22:38.
Powered by vBulletin® Version 3.6.8 Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0
A vBSkinworks Design
|  |