![]() |
manejo de threads ...
hola amigos,
La verdad no he usado threads porque, en teoria, no me han hecho falta :(. tengo una aplicacion que se conecta remotamente a una base de datos firebird y quería poder poner un progressbar mientras se espera que se carguen algunos datos. Ya estuve mirando sobre los threads con algunos enlaces que habeis recomendado pero no me aclaro mucho. Mi idea es que saque el progressbar en pantalla mientras se carguen los datos o una animacion, el caso es que no parezca que se ha congelado la aplicacion mientras esta en el proceso. Estaba probando este ejemplo pero no va muy bien:
Le doy al botón para que inicie pero no se llena la barra. Ademas no veo donde puedo colocar el codigo para que mi aplicacion continue. Si me orientais un poco ;). |
Hola anubis.
En este enlace: Velocidad de un timer, tenes un ejemplo de como implementar un timer con thread. Escribí el código para Delphi pero lo acabo de probar en Lazarus y funciona perfectamente con solo hacer unos pequeños cambios. En la unidad uTimeThread:
Y en el ejemplo de uso: La adaptación a un TProgressBar es tan simple como:
Saludos :) |
Gracias, ya lo implemente, pero me surgen algunas dudas.
En teoria siempre hay que usar un timer para el thread?. Tengo que ver mas a fondo los threads porque no me aclaro mucho la verdad. Si pongo el inicio del thread en el form1.activate, hago lo que tiene que hacer los procesos, cuando acaban de inicio, ya le pongo la procedure finalizar. Aun asi, con todo y todo, se tarda algo. En el create no se puede porque todavia no esta creado el form. Si es un poco de lio los threads. Sabeis algun enlace donde pueda ver bien los threads?. Ya vi los del wiki, pero me lian. gracias |
Hola anubis
Cita:
Cita:
Cita:
Saludos :) |
Gracias eficsa, mi intención era:-) muy simple. Como conecto con una base de datos remota y tarda algo, quería visualizar algo que dijera que esta en proceso para que no piensen que esta congelado
|
Cita:
¿ Con que RDBMS y componentes estas trabajando ?, para lo que buscas hacer seguramente exista una opción mas simple. Saludos :) |
Superserver Firebird en Linux, lazarus y componentes zeos en windows
|
Una duda.
Lo que necesitas es que no se bloquee la aplicación o mostrar una barra para que se vea que está "bloqueada haciendo algo". :confused: |
Tenía la misma duda que Neftali, de ahí mi pregunta anterior.
Por que si se trata solamente de avisar al usuario que se está intentando conectar a la base de datos, bastaría con usar un form no modal con (por ejemplo) un Label para el mensaje, algo como: No uso Zeos, así que el código está redactado sobre el mensaje, es a fin de darte una idea. Saludos :) |
Gracias a los dos,
Lo de conectar ya lo hice con una splash y un progress bar y parece que si funciona, igual no sea un metodo elegante, pero si hace su funcion. El problema lo tengo cuando se crea el form.activate, que tarda un poco, eso ya lo solucione con otro progress bar con un thread que saque de una pagina con un timer, que es lo que preguntaba si siempre era necesario porque aun asi tarda un poquito en desaparecer, ya no se si es por el terminate del thread o no se. Lo poco que entiendo, de momento, de los threads, es que puedes hacer, por ejemplo, dos tareas a la vez o mas si cabe, pero en este caso dos. La primera, que vaya cargando los datos mientras aparece un aviso para que no se piense que esta bloqueado, ya puede ser con un progress bar o simplemente una imagen o un label. La segunda parte que no funciona con el thread, porque el progress bar no avanza y da lo mismo ponerlo o no, porque tarda igual que sino lo pongo. Es cuando pongo el comienzo del thread y despues asigno el dataset (que es remoto) y despues termino el thread. Segun pensaba, el thread es tambien para eso, para segun hacer dos cosas a la vez, si pasarse claro esta. |
No es mas fácil ver que es lo que está ralentizando la conexión? Yo no trabajo con FB, pero sí con MySQL y nunca mis usuarios han tenido que esperar mas tiempo del normal como para ponerles una barrita que les diga que se "está conectando" y mira que mis usuarios tienen conexiones paupérrimas.
|
Si, eso ya lo busque pero parece que no va por ahi, o eso creo;).
Uso primero conexion ssh puente para conectarme a la base de datos. Ya hice primero un programa simple en el que coloco un dbgrid que, a lo sumo tendra 50 clientes, y si, tarda, digamos 15 segundos, evidentemente no voy a esperar que se abra como si estuviera en red local o en la misma computadora. Si bien es cierto que no recomendais hacer 'select * from clientes', si necesito hacer eso para que el usuario elija un cliente de la lista. |
Hola, y gracias a todos por vuestras respuestas.
Ya he optimizado mejor las consultas y es un poco más rápido ;). Aún así si tengo intención de usar threats que parece que es lo mejor para muchas cosas ;). Con un timer ya lo intente pero parece que cuando se solicita la consulta el timer no salta porque la consulta bloquea la aplicacion, lo que nose es si con un threat tendria que rehacer el programa o se puede implementar de alguna forma. Honestamente, a pesar de los ejemplos, no me aclaro mucho :(, aunque intento "ver" la composicion desde todos los angulos, se que deben de ser faciles de usar pero no veo el click, tambien se que no es bueno abusar de los threats ;). En definitiva, la pregunta, a ver si voy agarrando el chiste, es si implementando un threat tengo que rehacer el programa o bien es facil implementarlo. gracias |
Hola anubis.
Como comentas en el mensaje #5, el problema del retardo se produce en la conexión a la base de datos remota. Entonces, la implementación de threads sólo se justificaría si el usuario de tu aplicación puede desarrollar actividades con tu aplicación aún sin haberse establecido la conexión. De otro modo, threads mediante o no, el usuario va a tener que aguardar el tiempo que la conexión requiera para empezar a operar. Saludos. :) |
Gracias ecfisa.
Lo unico que queria era sacar una imagen diciendo que espere pero la consulta bloquea la aplicacion en lo que tarda en responder. Nicon u show form sirve |
Cita:
Entonces vuelvo a retomar la idea que te sugerí en el mensaje #9. Ahora crea otro form, quitalo de autocreate forms y agregale un Label, StaticText o el componente que te guste para mostrar el mensaje "Intentando conectar con la base de datos". Para el ejemplo llamémoslo frmMsgWait. En el DataModule: El ejemplo esta redactado en Delphi/IBX que son los componentes que uso, pero creo que en líneas generales tiene muy poca diferencia con Lazarus/Zeos. Saludos :) |
Retomando un poco el tema de los threads, que me vuelve loco y no doy con ello la verdad.
Si ya tengo mi aplicacion hecha y funcionando, si quiero poner un thread, que seria para poner un form o hacer algo, el thread solo sera para esa cosa que yo le diga sin afectar al programa. Es así?. Yo bastante burro y mas cuando no duermo o sera que estoy viejo ;). En base a todo lo que me habeis dicho anteriormente, con los forms parece que funciona algo pero queria aprovechar para meterle un thread y probar. Asi que resumo si es que estoy bien. Mi aplicacion funciona, si en alguna tarea tarda mucho, le meto un thread y en ese thread hago otra cosa mientra la aplicacion sigue su funcionamiento normal puesto que lo tenia como unico hilo (por asi decirlo). Lo pregunto asi a ver si de esta forma me queda un poco mas claro. gracias y perdonad |
anubis,
Cita:
El hilo solo procesara la parte del programa que quieras que se ejecute en un hilo paralelo al hilo principal, liberando al hilo principal para realizar otras tareas si fuera el caso y sin afectar el rendimiento global de la aplicación en términos generales. Revisa esta información: Cita:
Nelson. |
Si la, ando revisando y me lio la verdad. A ver si saco algo positivo.
Si lo que quiero es un thread de una llamada, a, un form |
El manejo de Threads "manualmente" es de notoria dificultad.
Hay 2 modelos que solucionan este tema (El modelo de "Actor" y los "CSP"), pero buscando rapido veo que en Delphi no hay nada parecido, lo cual es una lastima. En el pasado he usado tanto: http://andy.jgknet.de/blog/bugfix-un...unction-calls/ Como http://otl.17slon.com/ (Probablemente mejor este, ya que soporta versiones nuevas de Delphi) y son una *gran* mejora vs. el manejo manual. ---- Pensando "Imposible que en pleno 2015 y Delphi no tenga una forma manera de hacer eso" me puse a buscar mas y veo que: Si! http://community.embarcadero.com/ind...untime-library En concreto estas se ven prometedoras: http://docwiki.embarcadero.com/Libra...hreading.TTask http://docwiki.embarcadero.com/Libra...eading.TFuture |
La franja horaria es GMT +2. Ahora son las 08:55:52. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi