FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Formulario con threads
Hola , eh observado siempre de aplicaciones en delphi que realizan muchas tareas y nunca se tildan ni esperan , osea que los demas controles del formulario se pueden usar , en mi caso , siempre se tildan mis programas como 3 segundos hasta que termine la tarea , ¿ como hacen esos programadores ? ¿ usan threads por cada boton ?
|
#2
|
||||
|
||||
Una buena practica que se usa para realizar procesos que demanden bastante consumo de recursos y/o bastante tiempo en ejecución se tiende a ejecutarlo a traves de un hilo para evitar que la intefaz grafica aparente estar congelada mientras se ejecuta dicho proceso.
pasate por google y escribe "hilos delphi site:www.clubdelphi.com" y veras como te salen varias opciones bastante descriptivas. Si te aparece alguna duda especifica aca estaremos. Saludos. |
#3
|
||||
|
||||
Cita:
Deberias explicar, cuales son esas tareas antes de probar a moverlas a un thread.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#4
|
||||
|
||||
Por otro lado, el objeto Application posee el método ProcessMessages. Este método procesa los mensajes del sistema operativo, de forma que puedes usarlo para evitar este tipo de bloqueos. Por ejemplo:
|
#5
|
||||
|
||||
Uno no implementa un thread para un boton, implementa metodos y luego esos metodos los ejecuta en segundo plano (en background) en otro(s) hilo(s) de ejecucion, para que el hilo principal que controla la interfaz pueda seguir haciendo su trabajo
Usar Application.ProcessMessages para mi es como poner un goto; lo siento pero creo que es ahogarse en un vaso de agua. La forma de resolver estos problemas es usando threads; y si, es dificil, muy dificil, es un arte. Por eso es que siempre se insiste en escribir codigo desacoplado, sobre todo desacoplado de la VCL; los procesos de negocio deberian poder funcionar en una aplicacion de consola Si se escribe codigo de esta manera, pasarlo a multi-thread es mucho mas facil, mucho mas natural y mucho mas poderoso (mas rapido y eficiente a la hora de usar recursos) Un buen sitio para aprender multi-thread con delphi es el de Primoz Gabrijelcic: Revisa su blog, sobre todo la parte de presentaciones Este es su sitio web personal, donde tambien demuestra como usar la nueva unidad System.Threading que se incluye a partir de XE 7 Y por ultimo hay varios replays de CodeRage en Youtube donde tambien se muestran tecnicas muy interesantes Última edición por AgustinOrtu fecha: 25-01-2016 a las 23:56:23. |
#6
|
|||
|
|||
hola , les agradezco las respuestas , los threads son para cargar paginas en idhttp , escanear puertos , y buscadores de archivos.
una pregunta , ¿ entonces lo que tengo que hacer es crear un timer por boton usando Application.ProcessMessages ? |
#7
|
||||
|
||||
Cita:
Para las questiones que comentas puedes utilizar "sin problemas" threads. Es cuestión de empezar a ver cómo funcionan y luego aplicarlos. Si lees un poco de documentación, verás que siguiendo algunas normas sencillas, y con un poco de práctica no son tan difíciles como a priori parecen. Cita:
Por ejemplo, si utilizas un código como este:
Verás que durante su ejecución el sistema se detiene y queda "congelado"; Simplemente es porque durante mientras ejecuta este código, el sistema no se detiene a atender a otras tareas como los mensajes que llegan del ratón o redibujar elementos de pantalla; Eso da la impresión que el sistema se "tilda" como tu comentas. Si lo cambias por este:
Entonces lo que le decimos al sistema es que cuando llega al "Application.ProcessMessages" justamente haga eso. Durante un instate se dedique a procesar otros mensajes que le lleguen (de ahí lo de "procesar Mensajes"). Eso provoca que la aplicación no se "bloquee" (o no de esa impresión). Hay que decir que el ProcessMessages no siempre es la solución. Hay casos, por ejemplo, si realizamos una petición a un FTP, a un WebService, ejecutamos una consulta,... en que no podemos utilizarlo, simplemente porque no tenemos ningún bucle donde colocarlo. En esos casos, es en los que los threads nos pueden ayudar (el tema de Base de Datos es algo más complejo). Este ejemplo, habla de realizar peticiones utilizando las Indy mediante Threads. Aquí, un par de ejemplos sencillos sobre threads, adecuados para empezar (ej1, ej2). Un saludo.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#8
|
||||
|
||||
Cita:
|
#9
|
||||
|
||||
También los eventos "OnShow", "OnActivate", "OnPaint" de las ventanas, hay que usarlo lo mínimo posible, con "código rápido".
Saludos!
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#10
|
|||
|
|||
Genial , el multi threading es todo un tema , es bien avanzado , me va gustar estudiarlo , ¿ que es mas rapido o cual se nota mas rapido o se tilda menos en la aplicacion usar "Application.ProcessMessages" o hacer multithreading ?
|
#11
|
|||
|
|||
Otra duda sobre el tema , seria que por ejemplo un formulario tengo dos botones , uno empieza una funcion larga , el otro boton para todo el proceso del boton uno , como los botones empezar y parar , pense que seria facil , solo meto la funcion larga en el primero boton en un timer y le activo para despues parar el timer desde el segundo boton , pero el problema es que no sabria ignorar el timeout del timer , ya que se ejecutaria cada 1 segundo lo mismo , ¿ como se hace realmente ?
|
#12
|
||||
|
||||
Creo que quieres matar moscas a cañonazos.
Lo primero de todo es saber el motivo de que vaya lenta tu aplicación, que por cierto, no has dicho nada de cuál es el problema que tienes realmente. Luego habrá que buscar soluciones. Pero si se pincha la rueda del coche, la solución no es esta: |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Threads y DataModule | brandolin | OOP | 5 | 20-10-2011 21:33:31 |
uso de threads | JULIPO | API de Windows | 2 | 25-07-2007 16:09:06 |
Threads in DLL's | Gianni | Varios | 0 | 20-07-2007 22:18:23 |
threads multihilo | walito | API de Windows | 5 | 13-06-2007 19:34:26 |
uso del WaitFor() en Threads | chalitox | Varios | 7 | 06-09-2006 23:34:56 |
|