![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
|
ejecutando hilos en componenetes indy tcp
buenos dias compañeros por requerimientos del cliente y limitantes de la red me vi forzado en partir una aplicacion en dos, la duda que tengo y por mas que leo no logro convencerme o saber con certeza que es lo que sucedera, les platico tengo una aplicacion conde delphi 7 y mssql 2005 la cual tambien conecta con otras bd de access y mysql, para los procesos que involucran coneccion en access y mysql esa es la parte que la envie a un nuevo .exe la idea es que las aplicaiones clientes manden llamar a este nuevo .exe para que genere esos procesos la duda radica aqui que pasara cuando una estacion mande llamar un proceso donde ejecuta querys y otra estacion haga lo mismo cuando la primera estacion no ha terminado el proceso.
pregunta: el componente sabe que debe de experar a que termine de ejecutar los procesos de la primera peticion para cotinuar con la peticion de la segunda maquina gracias por cualquier respuesta. |
|
#2
|
||||
|
||||
|
sigo con las pruebas y si al parecer me hace falta algo, ya que al ejecutar los querys y simular un enpalme de peticiones de dos maquinas diferentes me marca un error y la aplicaion server se queda pasmada, el error que me marca es que no se pueden completar las operaciones de forma asincrona, algun manual donde pueda ver como sincronizar las operaciones gracias
![]() |
|
#3
|
||||
|
||||
|
pues valla sigo probando y creo que estaba un poco errado en lo que segun yo marcaba el error
, ahora me doy cuenta de que no es posible acceder a querys fijos por medio de hilos por que sucede lo que ya les he contado sigo investigando si es posible meter sentencias sql y cadenas de conexion sobre los hilos cualquier idea es bienvenida![]() |
|
#4
|
||||
|
||||
|
Cita:
Si necesitas hacerlo, debes crear una nueva conexión en cada hilo (pasándola la cadena de conexión, por ejemplo).
__________________
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. |
|
#5
|
||||
|
||||
|
gracias neftali por la respuesta, sabes entre mas leo se me aclaran mas las ideas, realmente lo que quiero lograr es que la parte que se ejecuta como servidor (un .exe que corre en el server) sea el que ejecute los querys pero ahi una pieza clave que no logro decifrar aun
, creare una funcion que me cree en tiempo de ejecucion las conexiones , y los querys que ejecuto tomando en cuenta el nombre de la maquina para evitar componentes con el mismo nombre pero al ejecutarlos me sigue quedando la duda si esto funcionara crees que sea un camino viable mil gracias. |
|
#6
|
||||
|
||||
|
Cita:
__________________
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. |
|
#7
|
||||
|
||||
|
a ok gracias neftali intentare programarlo aunque tengo algunas preguntas que no me dejan avanzar, la necesidad de que este ejecutable lanze los querys es por que la red donde corren la aplicacion esta dividida en 3 vlans, 1 es para huespedes, 2 es la administrativa y la 3 es de uso exclusivo para un conmutador ip, la administrativa es donde corre normalmente la aplicacion pero las maquinas no pueden ver la 3 red, pero necesito recuperar y escribir informacion en la bd de mysql del conmutador, y la unica maquina con dos tarjetas de red capaz de ver la red 2 y 3 es el server es por eso que esta aplicacion necesita hacer los procesos con los componentes zeos y modificar la bd del conmutador y escribir informacion en la bd de mssql, despues de que terminen dichos procesos la aplicacion solo recoje los datos y los muestra.
1.-necesito por cada hilo que se cree, crear un tzconnection que les hereda la conexion a cada uno de los tzquery. 2.-despues de que se crean y tienen su sql cada tzquery, en que momento los ejecuto para que no se traslapen con otros(la integridad la manejare por medio de parametros un query nunca ira sobre la misma row) |
|
#8
|
|||
|
|||
|
Hola richy08,
En algún proyecto he realizado lo mismo que quieres hacer, es decir, un servidor multihilo que genera una batería de conexiones (una por hilo) de tan forma que cada hilo pueda ejecutar una serie de sentencias sql directa y simultaneamente. Puede funcionar perfectamente. Al leer lo que comentas, me surge una duda. Entiendo que lo que estás programando es un servidor TCP y que al recibir una conexión entrante (de un cliente) se atiende por un hilo en el servidor. ¿Por qué quieres generar una conexión por hilo en TCPServer? ¿para ganar mayor velocidad en la ejecución de sentencias? ¿agilizar la concurrencia en el servidor? Te lo comento porque también puedes crear un procedimiento en el TCPServer que se encargue de la conexión y de las sentencias SQL y llamarlo con el método synchronize del hilo. Básicamente esto lo que hace es acceder de modo controlado a la VCL y así evitas los problemas de acceso a componentes, por parte de lo hilos. Un saludo. |
|
#9
|
||||
|
||||
|
Cita:
por hilo es por que lo que he estando leyendo y comentarios de los compañeros que los querys no son hilo seguro es por esa la razon, creo que es esa la forma en que lo hice pero valla lo he estado testeando y al parecer funciona pero he tenido erorres de memoria en mi maqina por lo cual no estoy tan seguro de que tambien programado este , estos son los fragmnetos de codigo donde ejecuto las peticiones, te agradeceria si me pudieras orientar y en le caso de que vieras errores de logica me lo hicieras saber mil gracias por tu tiempo//cliente
//server
|
|
#10
|
|||
|
|||
|
Hola richy08,
A simple vista, creo, que los errores de memoria te vienen dado porque no estás destruyendo los querys que creas. Prueba a destruirlos cuando ya no los necesites. Un saludo. |
|
#11
|
||||
|
||||
|
gracias manuc la razon por lo que no los destruyo es por que no se con certeza si el hilo espera a que termine una peticion para empezar a ejecutar la otra, o si crea diferentes instancias de la funcion donde los crea me podrias iluminar saludos.
|
|
#12
|
|||
|
|||
|
Hola richy08,
Dentro de cada hilo, la ejecución es lineal. Es decir, cuando se conecta el tcpClient, el tcpServer Crear un hilo que atenderá la actividad de esa conexión y la ejecución del código programado para ese hilo se hará de forma lineal. Si, mientras un hilo ejecuta su código, entra otra conexión, se generará un hilo paralelo y se ejecutaran ambos al mismo tiempo. Gracias a esto, el TCPServer es multihilo y cada conexión se ejecuta de forma independiente, salvo en los puntos donde se utilice "synchronize". Sabiendo esto, puedes hacer dos cosas: 1.- Crear tus componentes en el evento onConnect del tcpServer. Es decir, por cada hilo que se crea en el tcpServer, creas los componentes correspondientes. Para este caso, deberías destruir los componentes cuando no los necesites, es decir, cuando se destruye el hilo. Esto ocurre en el evento onDisconnect del tcpServer. 2.- Crear tus componentes en el evento onExecute del tcpServer. Es decir, cada vez que un hilo tiene actividad, creas los componentes que necesites. Igualmente, cuando ya no necesites estos componentes, los debes destruir. Esto es justo al final del evento onExecute del tcpServer. En ambos casos, debes relacionar de alguna forma cada componente que creas con el hilo correspondiente, de tal forma que cuando un hilo finaliza su ejecución sepas qué componentes has de destruir. Otra cosa que te recomiendo, es que incluyas un try-except en tu evento onExecute, englobando todo el código, para que puedas controlar mejor la destrucción de los componentes que creas y no se te quede ninguno cargado en memoria. Espero haberte ayudado de alguna forma. Si tienes más dudas, pregunta sin problemas. un saludo. |
|
#13
|
||||
|
||||
|
Cita:
saludos |
|
#14
|
|||
|
|||
|
Hola Richy08,
Pues sí, alguna te puedo dar. Este código puede ser un poco más complicado de seguir al principio, pero creo que el más cómo, una vez lo tengas claro. 1.- Te Creas una nueva clase, para manejar tus componentes:
Cambia el tipo de componetes que quieras crear. 2.- Al recibir la conexión en el tcpServer Creamos los componentes:
3.- ¿Cómo usarlos?
4.- Como destruirlos:
Básicamente, lo que se haces es "recordar" la dirección de memoria donde están localizados los componentes, utilizando para ello un "puntero" que tiene cada conexión (.data). Lo he hecho de cabeza y sin compilarlo. Puede ser que me haya equivocado en algo, pero básicamente lo puedes hacer así. Si encuentra alguna duda, consulta sin problemas. Un saludo. |
|
#15
|
||||
|
||||
|
gracias manuc tratare de implementarlo asi y comento.
|
|
#16
|
||||
|
||||
|
hola manuc perdon por responder hasta ahora peor me habian asignado otras tareas sabes he estado haciendo pruebas sobre la red, y los sockets abren y cierran perfectamente pero al devolver por el hilo el mensaje de que el procedimiento se llevo acabo bien nunca ejecuta ningun query ni devuelve le mensaje, es justo en este pedazo de codigo, me podrias orientar si es que me hace falta algo, este codigo lo tome del ejemplo de IdTCPDemo, gracias
|
|
#17
|
||||
|
||||
|
sabes creo que mas bien el problema radica en este pedazo de codigo que corre en el cliente
ya que al llegar a esta linea Frm_Posgue.Client.ReadBuffer(CB, SizeOf (CB)); por alguna razon no manda llamar el Synchronize alguna pista de que pueda ser gracias por cualquier comentario |
|
#18
|
||||
|
||||
|
bueno por fin encontre mi problema jeje al parecer la forma en que creo los componentes no es la adecuada seguire investigando
![]() |
|
#19
|
|||
|
|||
|
Hola Richy08,
La verdad es que no lo entendí muy bien, pero me alegro que hayas encontrado la solución. Un saludo. |
|
#20
|
||||
|
||||
|
Buenas tardes manuc he estado reajustando el codigo con los ejemplos que me has dado pero me saltan algunos errores que no he conseguido resolverlos
![]() 1. el primero es al crear la clase en la linea de destructor Destroy; [Error] Interfaces.pas(47): Unsatisfied forward or external declaration: 'tmisComponentes.Destroy', al comentarla el programa corre pero no se s iesto me desencadena algunos otros errores 2.-al querer asignarle al componente "conexion" la cadena de conexion que fue creada en el evento formcreate
al querer asignarle la cadena en el evento serverexecute MisComponentes.Conexion.ConnectionString:=cadena;
el error que envia es Project interfacesP.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use Step or Run to continue. alguna idea de que pueda ser mil gracias |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Como instalar los componenetes de la Norma 19 | diego11 | Varios | 3 | 17-10-2007 12:08:44 |
| componenetes en un TTabControl | lucasarts_18 | OOP | 2 | 27-09-2005 23:44:43 |
| instalar nuevos componenetes | aranel | OOP | 6 | 02-08-2005 09:25:33 |
| Multiple Hilos con Indy en Delphi 6 | cancerbero | Varios | 4 | 12-06-2004 19:01:21 |
| Componenetes para envio y recepcion de mensajes en la red | enrique800 | OOP | 3 | 29-01-2004 04:31:41 |
|