Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Varios Hilos (https://www.clubdelphi.com/foros/showthread.php?t=85102)

Rockin 29-01-2014 09:08:23

Varios Hilos
 
Buenas a todos, primero perdón porque no se si va en este apartado del foro mi pregunta.

Después de varios años porgramando, voy a empezar a usar Hilos de ejecución, ya he visto varias cosas en los trucos, foros, blogs y demás. Cuando es un hilo lo veo claro, pero tengo que hacer algo un poco más complejo.
Actualmente tengo una aplicación que calcula los tipos de ventas de unos agentes, sus horas, sus ratios, etc....
Son varias consultas, lo que hago actualmente es hacer la primera consulta StringGrid, luego la segunda, etc... al final cada resultado de las consultas se guarda en su celda de un StringGrid y añado una fila, y así con todos los agentes.

Me gustaría lanzar las consultas en varios hilos para acelerar el proceso, pero me surge la duda de como controlar que no escriba ni incremente la fila hasta que todas las consultas hayan terminado, son unas 20 consultas, cada una de su padre y de su madre unas a Firebird, otras a SQL en fin un lío.

A ver si de esta manera lo veis más claro
Código Delphi [-]
for i:= to num_agente do
begin

ventas:= CalcularVentas(nombre_agente);
horas:= CalcularHoras(nombre_agente);
ratios_venta:= CalcularRatioVenta(nombre_agente);

StringGrid[0,i]:= ventas;
StringGrid[1,i]:= horas;
StringGrid[2,i]:= ratios_venta;
StringGrid.rowcount := StringGrid.rowcount + 1;

end;

Querría lanzar las distintas consultas y que cuando estén todas finalizadas me rellene el grid y pase al siguiente agente.

No se si me he explicado bien, es algo lioso.

Gracias de antemano.

Neftali [Germán.Estévez] 29-01-2014 11:39:54

Se me ocurre que podrías crear una lista de Objetos (TObjectList) e ir guardando referencia de los threads que lanzas. Yo lo hago a menudo para tenerlos controlados.
Almacena en cada thread el resultado.
A medida que vayan finalizando no los destruyas (free) y controla cuantos todos ellos hayan finalizado.
Cuando estén todos acabados (sin liberar), recórrelos y guardas los datos en el StringGrid.
Luego ya podrás destruirlos.
Lo único es que durante ese tiempo estarás consumiendo recursos.

Otra opción sería crear una lista intermedia para ir almacenando los resultados a medida que los threads acaben. En este caso los puedes liberar.
Cuando estén todos finalizados pasa los datos de esa lista intermedia al stringrid.

Recuerda que si vas a realizar conexiones a BD, debes crear una conexión por thread. Eso en algunos casos, (si vas a lanzar 20) te puede traer problemas.

Rockin 29-01-2014 12:02:23

Gracias por la rápida respuesta, probaré así.

Estoy usando XE5 con servidor capa intermedia DataSnap, crearé un ClientDataSet por consultar a ver que pasa.

Os digo como me va.

Saludos


La franja horaria es GMT +2. Ahora son las 07:34:07.

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