Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Consulta sobre Threads (https://www.clubdelphi.com/foros/showthread.php?t=94769)

lbidi 07-07-2020 20:33:29

Consulta sobre Threads
 
Muy buenas foristas. Tengo la siguiente duda.

He desarrollado un sistema para escritorio ( MDI ) para casas de comidas ( pizzerias, deliverys, etc ), en la cual toman pedidos ingresando el numero de telefono. Por otro lado, tengo otra ventana mdi hija que se ejecuta minimizada al iniciar el sistema, y en la cual tengo un timer que se ejecuta cada 90 segundos chequeando contra un webservice de un tercero , pedidos nuevos en la app del cliente y asi integrarlos al sistema.

Esto anduvo barbaro hasta ahora hasta que los pedidos por la app se fueron incrementando y asi tambien los pedidos por telefono, y lo que
esta pasando ( es mi suposicion ) es que cuando se esta ingresando datos en algun edit del form principal , el sistema queda "bloqueado" por un par de segundos en el cual , el timer se esta ejecutando y accediendo al web service buscando nuevos pedidos.

Por lo cual he pensado que lo mejor es hacer que ese timer y busqueda se realice en otro hilo asi no interfiere con el principal.

He revisado y leido muchos foros y helps donde se habla de hilos y mis dudas son las siguientes:

- Debo crear un thread donde en el metodo Execute solo consulte contra el wb y nada mas , no ? He leido que no se puede usar nada de UI en este metodo asi que los edits y grillas que tengo para mostrar lo que me devuelve el ws deben estar fuera de este metodo ? En donde ?

- El timer deberia seguir funcionando igual pero llamando siempre al methodo execute del thread o deberia crear y destruir el hilo en cada instancia ??

- Los metodos start y/o resume del thread , en este caso son utiles ? Y en caso afirmativo, como se deben usar ?

Cuales serian sus consejos para este caso ??

Muchas gracias !!

He estado probando el componente BMThread de Boian Mitov, el cual esta muy bien estructurado, pero al no saber como encarar el desarrolllo de hilos, no me ha servido de mucho hasta el momento.

oscorm 07-07-2020 20:37:02

Hola paisano!
Lo puedes implementar en un servicio de Windows que ejecute el hilo, es bastante simple.
Implementas el método execute con un timer y arreando.
Espero haberme explicado, si no es el caso, lo intentaré hacer mejor la próxima vez.
Saludos

gatosoft 07-07-2020 21:04:34

Cita:

Empezado por lbidi (Mensaje 537898)
Muy buenas foristas. Tengo la siguiente duda.

He desarrollado un sistema para escritorio ( MDI ) para casas de comidas ( pizzerias, deliverys, etc ), en la cual toman pedidos ingresando el numero de telefono. Por otro lado, tengo otra ventana mdi hija que se ejecuta minimizada al iniciar el sistema, y en la cual tengo un timer que se ejecuta cada 90 segundos chequeando contra un webservice de un tercero , pedidos nuevos en la app del cliente y asi integrarlos al sistema.

Esto anduvo barbaro hasta ahora hasta que los pedidos por la app se fueron incrementando y asi tambien los pedidos por telefono, y lo que
esta pasando ( es mi suposicion ) es que cuando se esta ingresando datos en algun edit del form principal , el sistema queda "bloqueado" por un par de segundos en el cual , el timer se esta ejecutando y accediendo al web service buscando nuevos pedidos.

Por lo cual he pensado que lo mejor es hacer que ese timer y busqueda se realice en otro hilo asi no interfiere con el principal.

He revisado y leido muchos foros y helps donde se habla de hilos y mis dudas son las siguientes:

- Debo crear un thread donde en el metodo Execute solo consulte contra el wb y nada mas , no ? He leido que no se puede usar nada de UI en este metodo asi que los edits y grillas que tengo para mostrar lo que me devuelve el ws deben estar fuera de este metodo ? En donde ?

- El timer deberia seguir funcionando igual pero llamando siempre al methodo execute del thread o deberia crear y destruir el hilo en cada instancia ??

- Los metodos start y/o resume del thread , en este caso son utiles ? Y en caso afirmativo, como se deben usar ?

Cuales serian sus consejos para este caso ??

Muchas gracias !!

He estado probando el componente BMThread de Boian Mitov, el cual esta muy bien estructurado, pero al no saber como encarar el desarrolllo de hilos, no me ha servido de mucho hasta el momento.


El thread puede trabajar con elementos de la GUI, pero debes asegurarte de utilizar Synchronize. Y por supuesto tener cuidado con el manejo simultáneo que el WS y el usuario le daran al componente. Me refiero que es posible que el usuario esté seleccionado un item que en los siguienets segundos cambie por otro en un refresh (por ejemplo).

Hay un componente que me parece muy interesante y es el BackgroundWorker de DelphiArea, que pese a no tener mantenimiento en mas de una década sigue vigente. Todos los compoentes de Delphi Area son sorprendentes porque puedes instalarlos y operarlos sin problemas en nuevas versiones de windows o Delphi.

Es solo para que lo revises, yo tengo un programa que inicié hace años con ese componente y no he querido cambiarlo (por pereza), pero igual funciona de maravilla. Los demos que tiene son pequeños pero muy ilustrativos, y en dos minutos estas poniendo el componente a producir.

Bueno, volviendo a tu caso, puedes además implementar una cola de mensajeria, es decir, que todo lo que se consulte a través del WS, se vaya almacenando en una BD local, asi tu programa interactua con una BD y no direcatmente con el WS... de este modo, si tu WS está "en espera" consultando info, tu programa está yendo y vieneindo a la BD sin problemas.


saludo,

lbidi 07-07-2020 21:35:48

Muchas gracias a ambos.

Vere ese componente que mencionas gatosoft a ver si lo puedo implementar.

Saludos !! ^\||/^\||/

Neftali [Germán.Estévez] 08-07-2020 12:13:48

Visto que no tienes mucha experiencia con hilos yo haría unas pruebas primero fuera de la aplicación.
Puedes revisar ejemplos de hilos en mi blog. Son sencillos, pero para ver la estructura y su funcionamiento creo que son suficientes.
https://neftali.clubdelphi.com/ejemp...-sin-utilidad/
https://neftali.clubdelphi.com/ejemp...-ampliado-v-2/
https://neftali.clubdelphi.com/utili...o-con-threads/
https://neftali.clubdelphi.com/ping-...ando-icmp-dll/
https://neftali.clubdelphi.com/obten...de-una-cancin/
https://neftali.clubdelphi.com/pendi...nd-tcontext3d/

Cita:

Empezado por lbidi (Mensaje 537898)
- Debo crear un thread donde en el metodo Execute solo consulte contra el wb y nada mas , no ?

El el Thread debes poner todo lo que necesites. En tu caso, crear los componentes de acceso, realizar la consulta y destruir lo creado.


Cita:

Empezado por lbidi (Mensaje 537898)
He leido que no se puede usar nada de UI en este metodo asi que los edits y grillas que tengo para mostrar lo que me devuelve el ws deben estar fuera de este metodo ? En donde ?

Tal y como te han dicho todo lo relacionado con UI puedes hacerlo dentro del Thread, pero utilizando el Synchronize.


Cita:

Empezado por lbidi (Mensaje 537898)
- El timer deberia seguir funcionando igual pero llamando siempre al methodo execute del thread o deberia crear y destruir el hilo en cada instancia ??

Yo dejaría el Timer y cada X tiempo, tal y como comentas, crearía el Thread, lo ejecutaría y lo destruiría.
Luego puedes decrementar el tiempo a medida que quieras aumentar la consulta de pedidos y que sea más frecuente


Cita:

Empezado por lbidi (Mensaje 537898)
- Los metodos start y/o resume del thread , en este caso son utiles ? Y en caso afirmativo, como se deben usar ?

Yo creo que te bastará con Crear, Ejecutar y Destruir.

Neftali [Germán.Estévez] 08-07-2020 12:15:32

Cita:

Empezado por oscorm (Mensaje 537899)
Lo puedes implementar en un servicio de Windows que ejecute el hilo, es bastante simple.
Implementas el método execute con un timer y arreando.


No le veo sentido a eso.
Si ya tiene una aplicacióin funcionando que es la que neceita los datos, para qué crear un servicio independiente.
¿Porqué no llamarlo desde la aplicación?

lbidi 08-07-2020 14:43:42

Muchas gracias German por tus comentarios.. Revisare tus links y vere como implementarlo.

Saludos. !!

oscorm 09-07-2020 12:39:45

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 537908)
No le veo sentido a eso.
Si ya tiene una aplicacióin funcionando que es la que neceita los datos, para qué crear un servicio independiente.
¿Porqué no llamarlo desde la aplicación?

Se puede hacer como tu dices claro, por lo que leí me pareció mejor que un servicio independiente se encargara de la tarea.
al final de cuentas no importa el como sino que funcione ;)


La franja horaria es GMT +2. Ahora son las 10:19:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi