Foros Club Delphi

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

brandolin 20-10-2011 15:33:35

Threads y DataModule
 
Hola a todos, espero que este tema vaya acá...
El tema es el siguiente. Tengo un datamodule que se se debe ejecutar en forma de backgroud en una aplicacion, ya que hace tareas de comunicacion con un servidor central.
Hay tareas que se ejecutan en este datamodule que hacen que la aplicacion se quede unos segundos congelada y luego sigue. Invenstigando un poco creo que lo mas conveniente es usar los Threads, pero no quiero tener que reescribir o copiar el datamodule completo, lo que me gustaria es poder ejecutar el datamodule completo, dentro de este threads.... ¿eso se puede hacer? ¿como?
desde ya muchas gracias.

Casimiro Notevi 20-10-2011 15:42:43

Un DataModule es un contenedor para almacenar DataSet, Table, Query, etc. pero no es algo que se pueda ejecutar, así que creo que hace falta que expliques de otra forma lo que necesitas porque no se entiende :)

Chris 20-10-2011 17:45:55

Hola Brandolin!

Mira, técnicamente sí se puede hacer lo que buscas, de hecho es muy fácil. Por ejemplo con un código así:
Código Delphi [-]
procedure TMiThread.Execute;
var
    CopiaDatabamodule: TMiDatamodule; // esta copia del dabatamodule se ejecutará en background.
begin
    CopiaDatamodule := TMiDatamodule.Create(nil);
    CopiaDatamodule.ejecutar_operaciones_con_el_servidor;
end;

Peroooo... No estoy seguro que el resultado final te convenza. Además, no sé que código hay en el procedimiento "ejecutar_operaciones_con_el_servidor" que pueda dar problemas al ser ejecutado en un hilo separado.

En lo personal preferiría reescribir el código dentro del mismo Thread. Pero es cosa mía. A cómo te he mostrado, no es necesario transladar el código, se puede hacer utilizando la estructura que te he mostrado. Sin embargo de la última manera puede dar muchos dolores de cabeza si el código interactua mucho con la aplicación.

Saludos,
Chris

brandolin 20-10-2011 21:24:04

Gracias por las ideas, en realidad yo estoy usando el datamodule como forma de encerrar una serie de cosas que hacen lo mismo, como por ejemplo un servicio de socket. Basicamente lo que hace es establecer un canal de comunicacion con un socketserver en el servidor y envia recibe informacion por ese canal. (ademas hay otros componentes como tablas, sqlquery, timers, etc)
He puesto y "encapsulado" de alguna forma en el datamodule todos los procesos que hacen a dicha cuestion, es decir lo chequeos, envios, recepcions, reconexiones etc etc etc...
de esta manera cuando queda mucho mas ordenada el codigo de la aplicacion ya que todo lo que tiene relacion con esto va en el datamodule.
El problema es que este datamodule notifica a diferentes partes de la aplicacion sobre cosas que pasan y la aplicacion envia cosas por medio de dicho socket.
Esto funciona sin problema pero hay veces que se queda congelada la aplicacion porque este module esta haciendo algo...
Creo que poner esto en un hilo es lo mas conveniente y "teoricamente" lo mas correcto. Pero el problema radica en que no podria crear una clase Threads que contenga el modulo y poner todas las funcionalidades dentro de este thread implica tener que generar mucho codigo en esta clase...
alguna otra idea...

Chris 20-10-2011 21:29:49

Cita:

Empezado por brandolin (Mensaje 416342)
alguna otra idea...

Lo mejor que podrías hacer es encapsular en el Thread el código que hace que tu aplicación se detenga. Lo demás puedes dejarlo en el DataModule. El ejemplo que te proporcioné anteriormente, era solo un ejemplo crudo de cómo podría hacerse de forma fácil lo que en tu primer mensaje pedías.

Lo bueno es que ya te estás dando cuenta que no es tan fácil y hay cosas que es bueno dejar y otras quitar del Datamodule. Es por eso que creo que lo mejor que puedes hacer es determinar el código que sería un buen candidato para ser trasladado a un Thread.

Saludos,
Chris

brandolin 20-10-2011 21:33:31

interesante ...........

basicamente lo que se quiere poner segun tus palabras es que en el mismo datamodule ponga un threads que haga el trabajo en multitarea... y que el resto de las cosas queden como estan...????

voy a probar a ver como funciona... muchas gracias.


La franja horaria es GMT +2. Ahora son las 21:55:41.

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