ID | Asunto | Fecha | Nick | |
57311 | Como dejar procesar distintos thread's y esperar el resultado | 29/10/13 14:58 | Manuel_74 | | |
Buenos días, ya he conseguido por fin pasar mi Sw de sincronismo (que me dejaba las cpu's temblando) a asincronismo gracias a "Pipe", estoy muy agradecido de haber pasado este primer punto de mi sufrimiento, ahora me lleva de cabeza otro y son los thread’s. Bien, le explico mi problemita: Cuando me realizan una petición de disponibilidad, el usuario me puede enviar varios establecimiento tal que así: 100|200|300|400, por cada uno de ellos pretendo crear un array de hilos, en este caso crearía 4 hilos de los cuales, cada uno deberá ejecutar un procedimiento almacenado que devolverá el resultado. Alguien podría ayudarme a crear ese array de thread’s, lo tengo diseñado así: Dim Cad_hot = Split(hotel, "|")
'creamos tantos hilos como hoteles Dim n_hilos As Integer = Cad_hot.Length Dim ar(n_hilos) As Thread Dim i As Integer = 0 Dim hilos_reales As Integer = 0
For Z = 0 To Cad_hot.Length – 1 ar(hilos_r) = New Thread(AddressOf Datos.calculo) ar(hilos_r).IsBackground = True ar(hilos_r).Start()
While ar(hilos_r).IsAlive (ESTO ESTA MAL, PUESTO QUE HASTA QUE NO TERMINE DE PROCESAR EL HOTEL 100, no pasaría a procesar el 200 Y ASÍ SUCESIVAMENTE)
End While
NodoHoteles = Datos.NodoHoteles_H hilos_r = hilos_r + 1
Next
Ya bien me dijo el gran amigo “Pipe” que está mal, ahora pregunto, como podría saber cuando el ar(hilos_r) de cada uno de los hoteles ha terminado?? Como debería de dejar seguir procesando los distintos hoteles y hasta que no acabasen todos no generase el resultado?? De nuevo gracias a todos. |
|
ID | Asunto | Fecha | Nick | |
57312 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57311) | 29/10/13 16:07 | Pipe[hgjfkdls] | | |
Manuel, tal ves lo mas simple seria algo como esto: string[] hoteles=dataHoteles.Split('|');
Thread[] hilos=new Thread[hoteles.Length];
for(int i = 0; i<hilos.Length; i++)
{
Thread hilo=new Thread(new ThreadStart(Calculo));
hilo.IsBackground=true;
hilo.Start();
hilos[i]=hilo;
}
bool alive=true;
while(alive)
{
alive=false;
foreach(Thread hilo in hilos)
{
alive|=hilo.IsAlive;
}
} Ahora lo explico, efectivamente creamos el array de hilos que necesitamos con una longitud definida por el numero de hoteles, luego, en el primer bucle for, inicial izamos todas las instancias de los hilos y le decimos que comiesen a "trabajar en paralelo", como la funcion requiere que todos los hilos terminen su trabajo antes de retornar un resultado, creamos un ciclo(while) el cual no terminara hasta que todos los hilos mueran. Saludos, [hgjfkdls] Pipe [Editado: [Hgjfkdls]Pipe, 29/10/2013 16:08:38] [[Hgjfkdls]Pipe, 29/10/2013 16:09:14]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57314 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57312) | 29/10/13 20:19 | Manuel_74 | | |
Hola Pipe, muchas gracias por tu pronta respuesta, lo estoy codificando tal cual me lo has dado, este sería el código en VB.net. Ahora mismo estoy probando con un solo hotel, en el bucle para comprobar si esta vivo el hilo pasa dos veces y en la linea "alive = alive Or hilo.IsAlive" la primera vez que pasa no da error pero la segunda que no entiendo porque pasa 2 veces, me da un error "referencia a objeto no establecida como instancia del objeto"
Dim hoteles As String() = dataHoteles.Split("|"C) Dim hilos As Thread() = New Thread(hoteles.Length - 1) {}
For i As Integer = 0 To hilos.Length - 1 Dim hilo As New Thread(New ThreadStart(Calculo)) hilo.IsBackground = True hilo.Start() hilos(i) = hilo Next
Dim alive As Boolean = True While alive alive = False For Each hilo As Thread In hilos alive = alive Or hilo.IsAlive Next End While
Gracias.
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57315 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57314) | 29/10/13 21:28 | Pipe[hgjfkdls] | | |
Manuel,
Que crees, también me sorprende que pase dos veces, de todas formas lo importante es que comprendas la esencia del algoritmo, esta es, creas tantos hilos como necesites, pones a trabajar a todos los hilos, esperas a que todos terminen para entregar el resultado, yo lo he probado y funciona bien.
Saludos,
[hgjfkdls] Pipe
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57317 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57315) | 29/10/13 21:42 | Manuel_74 | | |
Ok, muchas gracias, seguir intentando ver donde esta el problema.. Saludos y gracias por todo.
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57320 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57317) | 30/10/13 06:52 | Manuel_74 | | |
Buenos días, he conseguido reparar el error que comentaba ayer, si a alguien le interesa aqui tiene la solución. He controlado que el hilo no sea nothing, esto es lo que estaba provocando el error. Try
Dim vivo As Boolean = True
While vivo
vivo = False
For Each h As Thread In ar
If Not h Is Nothing Then
vivo = vivo Or h.IsAlive
End If
Next
End While
Catch ex As Exception
End Try Mil gracias a todos y en especial a "Pipe"
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57321 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57320) | 30/10/13 12:25 | Pipe[hgjfkdls] | | |
jejejejejeje, muy bien Manuel, pero veamos, efectivamente solucionaste el "efecto", pero la causa la esta generando un hilo de más que no debería por que inicializarse, en el código que te envié en C# no pasa eso, te recomiendo que intentes eliminar la causa y no el efecto.
Te preguntaras ¿por que?, bueno, mientras menos código generemos, mientras menos comprobaciones hagamos y mientras más "limpio" programemos...menos recursos consumiremos, mayor portabilidad tendrá nuestro código, y más eficaz y eficiente será nuestro programa.
Saludos,
Pipe [hgjfkdls]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57322 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57321) | 30/10/13 13:18 | Manuel_74 | | |
Buenas de nuevo, "Pipe" lleva razón, he repasado de nuevo el código y efectivamente estaba metiendo un hilo de más, la solución ha sido : Dim ar(Cad_hot.Length - 1) As Thread Siendo Cad_hot el número de hoteles pedidos. Con esto se resuelve tanto el efecto como la causa.. Mil gracias de nuevo.
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57327 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57322) | 01/11/13 18:11 | Manuel_74 | | |
Hola tengo una pequeña duda, que me ha surgido a la hora de programar. Bueno expongo un ejemplo que se verá mucho mejor: Como sabemos tengo un hilo por cada hotel, pero bien, ahora he creado otro array de hilos por habitaciones, todo funciona perfectamente, solo que a la hora de pedir dos habitaciones sobre un mismo hotel pues debo de romper por hotel, a ver… Me piden el hotel 100 y las habitaciones DB y la ID de ese mismo hotel (claro ), bien que es lo que me pasa, pues que tengo este código: Dim array_thread_hab(indice - 1) As Thread
Dim Num_hilos As Integer = 0
Dim hilo_hab As Thread
For Each Y In Diccionario_Hab
…
…
hilo_hab = New Thread(New ThreadStart(AddressOf
param.llamar_Hotel))
hilo_hab.IsBackground = True
hilo_hab.Start()
array_thread_hab(Num_hilos) = hilo_hab
Num_hilos = Num_hilos + 1
Next
Sub Llamar_Hotel()
Dim ar(Cad_hot.Length - 1) As Thread
Dim i As Integer = 0
Dim Num_hilos As Integer = 0
For Z = 0 To Cad_hot.Length - 1
…
…
hilo = New Thread(New ThreadStart(AddressOf datos.Montar_Xml))
hilo.IsBackground = True
hilo.Start()
ar(Num_hilos) = hilo
Num_hilos = Num_hilos + 1
Next
Sub Montar_Xml()
Dim con_string As
String =
System.Configuration.ConfigurationManager.AppSettings("conex1")
Dim con As New SqlClient.SqlConnection
con.ConnectionString = con_string
con.Open()
Dim Commando As New SqlCommand
Commando.CommandText = "dbo.Sp_Hoteles_habitaciones"
Commando.CommandType = Data.CommandType.StoredProcedure
Commando.Connection = con
…
…
Dim AuxHotel As Integer = 0
For Each fila As DataRow In tabla.Rows
‘Rompo por hotel
If AuxHotel <> fila("hotel") Then
h = New D_Hotel
h.D_ListaHabitaciones = New List(Of D_Habitacion)
h.D_CodigoHotel = fila("hotel")
h.D_DescripcionHotel = fila("Descripcion_hotel")
NodoHoteles_H.D_Hoteles.Add(h)
AuxHab = ""
ServicioAux = ""
End If continua [Editado: Manuel_74, 01/11/2013 18:12:29] [Manuel_74, 01/11/2013 18:14:13]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57328 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57327) | 01/11/13 18:13 | Manuel_74 | | |
‘Rompo por habitación
If AuxHab <> fila("habitacion") Then
habi = New D_Habitacion
habi.D_ServiciosHabitacion = New
List(Of D_DesgloseServicios)
habi.D_NumeroHabitacion = 1
habi.D_TipoHabitacion = fila("Tipo")
…
…
AuxHab = fila("habitacion")
End If
AuxHotel = fila("hotel") Bueno y ahora viene mi pregunta, si se fijan hay una variable llamada AuxHotel que aunque no debería de estar ahí porque siempre que llegue un hilo (hotel), se va a inicializar a 0 y siempre va a crear el mismo hotel y eso no es lo que pretendo, ya que las dos habitaciones cuelgan del mismo hotel, ¿donde debo de crear esa variable?, porque cada hilo (habitación,hotel) la va a inicializar a 0, cuando en este caso, la primera vez tendría que valer 0 y las demás el mismo hotel. O sea.. lo que devuelve ahora mismo es esto.. <D_Hoteles>
<D_Hotel D_Codigo="1" D_Descripcion="DESC HOT">
<D_ListaHabitaciones>
<D_Habitacion D_Numero="2" D_Tipo="ID" D_DescripcioN="HAB.
INDIVIDUAL"> <D_ServiciosHabitacion>
<D_DesgloseServicios D_Servicio="AL" D
_DescripcionServicio="ALOJAMIENTO">
</D_Hotel>
<D_Hotel D_Codigo="1" D_Descripcion="DESC HOT">
<D_ListaHabitaciones>
<D_Habitacion D_Numero="1" D_Tipo="DB" D_DescripcioN="HAB.
DOBLE"> <D_ServiciosHabitacion>
<D_DesgloseServicios D_Servicio="AL" D
_DescripcionServicio="ALOJAMIENTO">
</D_Hotel>
<D_Hoteles> Y lo que debería devolver sería esto otro: <D_Hotel>
<D_Hotel D_Codigo="1" D_Descripcion="DESC HOT">
<D_ListaHabitaciones>
<D_Habitacion D_Numero="2" D_Tipo="ID" D_DescripcioN="HAB.
INDIVIDUAL"> <D_ServiciosHabitacion>
<D_DesgloseServicios D_Servicio="AL" D
_DescripcionServicio="ALOJAMIENTO">
<D_Habitacion D_Numero="1" D_Tipo="DB" D_DescripcioN="HAB.
DOBLE"> <D_ServiciosHabitacion>
<D_DesgloseServicios D_Servicio="AL" D
_DescripcionServicio="ALOJAMIENTO">
</D_Hotel> Faltan algunas estiquetas de cierre pero bueno, es para que se hagan una idea.. la clave esta en donde inicializar o donde crear esa dichosa variable al igual que voy a tener que crear una aux para habitaciones y otra para servicios. Desde ya mil gracias a todos.
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57330 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57328) | 04/11/13 12:02 | Pipe[hgjfkdls] | | |
Manuel, Eso esta pasando por la siguiente lienea de codogo: h = New D_Hotel
h.D_ListaHabitaciones = New List(Of D_Habitacion) Lo que esta pasando es que cada ves que llamas a Montar_Xml crea tanto el hotel como la lista de habitaciones. Ya diste tu primer paso, trabajar con hilos, ahora solo te falta pasar variables a estos hilos. De esta forma podrás decirle a tu función de búsqueda a que hotel quieres añadir las habitaciones. Aun que yo preferiría hacerlo mediante delegados asíncronos. Saludos, Pipe [hgjfkdls]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57331 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57330) | 04/11/13 12:17 | Manuel_74 | | |
Hola Pipe.
Entonces, la variable auxiliar sí que deberían de estar donde están??? Dim AuxHotel As Integer = 0 Es muy difícil trabajar con delegados, tendría que cambiar mucho código? Se lo digo porque ahora mismo el código que tengo es muy fácil de entender. Lo que tendría que hacer es pasar a la clase “montar_Xml” las variables D_hotel y D_Habitaciones e ir arrastrándolas?? Gracias Pipe.
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57332 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57331) | 04/11/13 12:50 | Pipe[hgjfkdls] | | |
Manuel, Por la naturaleza asíncrona de los delegados sera necesario generar algunos cambio pero no sustanciales, recuerdas los delegados que ocupamos para generar el WS asíncrono?... pues seria algo similar. a ver si se explica mejor en el código... //creamos un delegado que requiera una entrada hotel...
así como el delegado del WS pero ahora pasamos un D_Hotel
public delegate void DelegadoHotel(D_Hotel hotel);
public void Montar_Xml(D_Hotel hotel)
{
//buscas las habitaciones que necesitas
foreach...
{
//cuando las encuentras se las añades al hotel
if(habitacion.cumple)hotel.habitaciones.Add(habitacion);
}
}
//ahora para llamarlo...deberías hacerlo desde el hilo del hotel
//hilo hotel...
//creamos el hotel
D_Hotel hote=new D_Hotel();
DelegadoHotel d=new DelegadoHotel(Montar_Xml);
//si necesitamos una llamada sincrona:
d.Invoke(hotel);
//si necesitamos una llamada asíncrona(o en otro hilo)
d.BeginInvoke(hotel, null, null);
//en este caso no necesitamos un función que se dispare cuando
termine el proceso ni un objecto State que pasar, por eso he puesto en null los dos
parámetros finales. Saludos, Pipe [hgjfkdls] [Editado: Pipe[hgjfkdls], 04/11/2013 12:51:57]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57333 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57332) | 04/11/13 13:03 | Manuel_74 | | |
Muchas gracias Pipe, voy a intentarlo tal como lo tengo, si veo que no puedo, intentare realizarlo como bien dice.. Mil gracias. Saludos.
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57334 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57333) | 04/11/13 13:07 | Manuel_74 | | |
De todas formas, me estoy dando cuenta que primeramente leo las habitaciones y despues los hoteles y creo que debería de ser, primero los hoteles y despues de cada hotel ir creando los hilos habitaciones ¿verdad? Saludos.
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57335 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57334) | 04/11/13 19:51 | Pipe[hgjfkdls] | | |
Manuel,
según la EDT (estructura de descomposición de tareas) debes siempre comenzar de lo mas general(global) a lo mas especifico(particular), y eso también tiene cabida en la programación, esto implica que un "gran problema" lo descomponemos en muchos "pequeños problemas" que sean mas fácil de manejar. Esto es similar, tu búsqueda es por hoteles, luego por habitaciones y luego por lo que quieras...esta estructura también debe ser implementada por tus clases y métodos de búsquedas.
en fin...dentro de la búsqueda, creas hilos hoteles; en cada hilo hotel, creas hilos habitaciones; en cada hilo habitación, creas hilos de lo que desees....recuerda que antes de cualquier "salida" debes antes esperar que los hilos terminen.
Saludos,
Pipe [hgjfkdls]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57336 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57335) | 05/11/13 06:26 | Manuel_74 | | |
Ok, muchas gracias.. Saludos.
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57338 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57336) | 06/11/13 08:34 | Manuel_74 | | |
Buenos días, En realidad en este caso, daría igual comenzar por hotel o por habitación puesto que hay que ir rompiendo por los dos, mira te indico el request Xml que realizo, no puedo pedir un hotel y después meter en un bucle las habitaciones hasta que termine, puesto que me pueden pedir dos habitaciones distintas, mira: <Usuario>Prueba</Usuario>
<Password>test</Password>
<Establecimientos>100,200,300</Establecimientos>
<FEntrada></FEntrada>
<FSalida></FSalida>
<Habitaciones>
<Habitacion>
<Cod_Hab>DB</CodHab>
<Servicio>AD</Servicio>
</Habitacion>
<Habitacion>
<Cod_Hab>ID</CodHab>
<Servicio>AL</Servicio>
</Habitacion>
</Habitaciones> Lo primero que realizo es recorrer los bloques "Habitacion" y crear en este caso dos hilos de habitación (hilo_hab_1, hilo_hab_2), después por cada hilo habitación creo tres hilos de hotel puesto que han pedido 3 hoteles (hilo_hotel_100, hilo_hotel_200, hilo_hotel_300). Luego no puedo hacer esto que me comenta: //buscas las habitaciones que necesitas
foreach...
{
//cuando las encuentras se las añades al hotel
if(habitacion.cumple)hotel.habitaciones.Add(habitacion);
} Si lo hago así, dentro de este “forearch” voy a tener que volver a llamar a los hilos por habitación y voy a tener el mismo problema en romper por habitación. No sé si me entiende, la verdad que explicarlo escribiendo tiene migas.. pero bueno, poquito a poco . Me podría dar una ligera idea de cómo hacerlo con paso de variables?? Muchas gracias por soportar toda la brasa que le estoy dando. [Editado: Manuel_74, 06/11/2013 08:34:59] [Manuel_74, 06/11/2013 08:35:45]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57342 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57338) | 08/11/13 16:23 | Pipe[hgjfkdls] | | |
Manuel,
No estoy muy de acuerdo con esa frase "da igual...por hay que ir rompiendo...", primero que todo, siempre habrán mas habitaciones que hoteles (al menos el mismo numero suponiendo que cada hotel contemple una habitación), por ende debería comenzar siempre discriminando hoteles y luego dentro de las habitaciones que tiene el hotel las que cumplan con el filtro (tipo, disponibilidad, etc...).
ahora bien, respecto a como pasar parámetros, pues de igual forma como lo hicimos con el WebService. recuerda que el WebService al convertirlo en asíncrono, trabaja en un hilo paralelo, cuando termina ejecuta un callback y obtienes tu objeto.
Saludos,
Pipe [hgjfkdls]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
57343 | Re: Como dejar procesar distintos thread's y esperar el resultado (Resp: 57342) | 08/11/13 23:39 | Manuel_74 | | |
Buenas noches, es que me pasa una cosa muy rara, he pasado el Sw donde primero leo los bloques de habitaciones y a continuación los hoteles, a leerlo al revés como bien me indico y como bien dice el “EDT”, pero resulta que me va más lenta la devolución de la petición y no veo el por qué, esto por ahora no me preocupa mucho, tendré que mirar el código más detenidamente.
¿Por qué digo que daría igual la lectura?, porque cada bloque de habitación y hotel viajan por hilos diferentes, o sea, como en el ejemplo anterior, envío la DB/AD con el hotel 100 por un hilo, y envío por otro hilo diferente la ID/AL con el hotel 100, luego debo detectar que es el mismo hotel para no tener que crear otro objeto hotel.
Si lo hago como bien comenta, primero hotel y habitación, estaríamos en lo mismo. Primero envío el hotel 100 con la DB/AD por un hilo y a continuación debería de enviar también el hotel 100 con la ID/AL por otro hilo, luego también debo detectar el mismo hotel para no tener que crear de nuevo el objeto hotel.
Por este motivo llegue a la conclusión de que la lectura no importaba, ya que llego a tener el mismo problema, bueno, problema que se puede solventar, aunque por ahora no lo tengo muy claro, pero intentare llegar al resultado final.
Otra cosita más Pipe.. Conoces la aplicación SOACleaner y Altova Xml Spy, son dos aplicaciones que utilizo para comprobar mi Sw, con SOACleaner puedo realizar pruebas de estrés y con el Altova puedo ir probando el resultado de la devolución de las peticiones ¿Por qué le comento esto? Porque cuando realizo una prueba de estrés, seguidamente me voy a Altova y lanzo una petición y hasta que no termina SOACleaner de devolver los resultados no me devuelve la petición realizada en Altova, si el Sw esta de forma asíncrona ¿Debería de devolver el resultado a la vez que se está ejecutando la prueba de estrés verdad? Pienso que el Sw esta de forma asíncrona, ya que cuando lanzo la prueba de estrés los procesadores no suben más del 50% de cpu, y antes era una barbarie, ya que se ponían al 100% y se quedaba todo paralizado. Saludos y como siempre agradecido de sus respuestas.
[Editado: Manuel_74, 08/11/2013 23:39:58] [Manuel_74, 08/11/2013 23:43:17]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |