Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error en hilos de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=93812)

mamcx 20-03-2019 20:18:27

El problema de fondo es que la estructuración que tienes no es la ideal para multihilos. La mayoría de los lenguajes no ayudan tampoco, incluido Delphi.

Yo haría lo siguiente:

- Anula por ahora lo de multihilos
- Convierte el código en una maquina de estados. Asegurate de PASAR DATOS(valores) y no POINTERS. En donde haces una transferencia, clona información.

Una vez tengas limpio el código y andando lo pones y te sugerimos como estructúralos para hilos...

hal1967 20-03-2019 21:23:16

Conexion no es threadsafe
 
Recuerda una conexión a una base de datos no es Threadsafe. Es posible que estás a mitad de una consulta y entre otro hilo (o el principal) y se cruce. Al servidor llegaría algo como "SELECT * FROM UPDATE ...".


Eso no solo pasaría con ODBC, pasaría con cualquiera.



Los servidores son threadsafe por que cada conexión es un hilo, pero no deberías tener en la misma conexión varios hilos al menos que trabajes con sincronización o locks (lo cual puede ser frustrante).


A otro nivel, a mi me ha tocado trabajar con cientos de hilos y es espetacular cuando funciona bien y de forma eficiente. No tienes porque crear un hilo, consultar y destruirlo, lo puedes volver a utilizar, lo creas en pausa con todos sus conexiones y dataset, cuando lo requieras start, cuando cierres tu aplicación liberas los hilos (previamente detenidos). La otra forma es que tengas un ciclo dentro del hilo, y al cerrar tu app, terminas previamente los hilos.


Si optas por algo de esto, no olvides, todo hilo debe ejecutarse al menos una vez, caso contrario dejas memoria en mal estado.

Neftali [Germán.Estévez] 21-03-2019 09:09:37

Cita:

Empezado por cmfab (Mensaje 531170)
Cuando el hilo se termina el Dataset creado en el mismo se destruye con la instrucción que puse anteriormente.
... por lo cual deduzco que la propia clase hace el trabajo.


Has creado los Datasets usando como Owner, el objeto Application, por lo tanto deberías revisar ese comportamiento.

cmfab 21-03-2019 20:36:35

Solución.

Bueno definitivamente el tema se ha solucionado (al menos en las últimas 24 horas) aumentando el tiempo de las conexiones de 20 a 60 segundos, por lo que al parecer el controlador ODBC requiere de tiempo quizá para liberar recursos. aún no he puesto la pregunta en la web de soporte del proveedor, pero casi seguro que por ahí anda el tema.

Gracias a todos por sus recomendaciones y opiniones.


La franja horaria es GMT +2. Ahora son las 04:47:17.

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