Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Seccion crítica (https://www.clubdelphi.com/foros/showthread.php?t=85298)

rabata2001 26-02-2014 18:42:57

Seccion crítica
 
Buenas a todos

Deseo realizar un proceso de clasificación de resultados y se trata de un proceso complejo que puede tardar unos 20oms que se repite con cada entrada de datos, y este proceso se puede ejecutar desde distintos puntos
1. cada entrada de mensaje
2. presionando un botón y realiza la clasificacion
3. un timer que se ejecuta cada 10 segundo s que realiza el mismo proceso.

La primera vez se realiza por cada entrada y los otros dos se realizan por si falla algo del proceso 1 o se cambio algo directamente en bbdd.

La idea es crear un seccion critica que encapsule al procedimiento de clasificacion para que se ejecute en orden y nada pueda entrar en ella miestrtas se esta realizando, si se reciben 10 mensajes a la vez se deben ejecutar en orden y eserar cada uno a que termine el anterior.

la idea es :

Bloquear (Lock)
realiza Proceso -- aqui se hacen todas las acciones (cambiar array, consultar bbdd, escribir bbdd, escribir stringgrid
Libera (Release)

Por ejemplo llegan 3 mensajes, y se presiona un vez el botón de clasificar y luego otros dos mensajes (en 100 ms)

el resultado deseado es

Mensaje1 bloquea
Proceso Clasifica
Mensaje1 libera

Mensaje2 bloquea
Proceso Clasifica
Mensaje2 libera

Mensaje3 bloquea
Proceso Clasifica
Mensaje3 libera

Boton Clasifica bloquea
Proceso Clasifica
Boton Clasifica libera

Mensaje4 bloquea
Proceso Clasifica
Mensaje4 libera

Mensaje5 bloquea
Proceso Clasifica
Mensaje5 libera

He usado sin creacion de hilos (no deseo usar hilos si puede ser). criticalsection, mutex, rtlcriticalsecrtion , pero o no los entindo bien o se deben usar siempre con hilos. tener en cuenta que el proceso es largo y tiene muchas cosas a hacer pero lo que quiero es garantizar que dentro de la region critica tan sólo se está ejecutando un proceso.

Podrías indicarme algún tipo de ayuda.

Gracias a todos por vuestra colaboracion

Casimiro Notevi 26-02-2014 19:20:20

Crea una simple cola (una lista FIFO). Que llegan peticiones... pues a la cola, que esperen, porque el funcionari solamente puede atender de uno en uno :)

rabata2001 27-02-2014 00:28:14

algún ejemplo en delphi de utilizacion de pilas (FiFO)

Crea, Apila, deapila y Vacia Pila.

tengo un indytcp server que recibe los mensajes, en el evento execute debería realizar introducir en pila (Apila),

Después realizar un procedimiento que deaplila. ¿como me aconsejáis con un timer? o ¿hay algún componente para manejo de pilas en delphi?.

Gracias y saludos.

Casimiro Notevi 27-02-2014 00:41:14

No, no, nada de timer. Cuando termina con uno, empieza con otro, como en la vida real, en las colas.

Puedes usar un simple stringlist para añadir tareas a la cola y eliminarlas según van acabando y que pase a la siguiente que toque.

ecfisa 27-02-2014 04:30:00

Cita:

Empezado por rabata2001 (Mensaje 473099)
...
¿hay algún componente para manejo de pilas en delphi?.
..

Hola rabata2001.

Delphi implementa la clase TQueue para el manejo de colas y TStack para el manejo de pilas.

Un ejemplo (más que básico) que utiliza ambas:
Código Delphi [-]
...
uses Contnrs;

procedure TForm1.Button1Click(Sender: TObject);
var
  Queue: TQueue;
  Stack: TStack;
  i: Integer;
begin
  ListBox1.Clear;
  Stack:= TStack.Create;
  Queue:= TQueue.Create;
  try
    for i:= 0 to 5 do
    begin
      Stack.Push(Pointer(i));
      Queue.Push(Pointer(i));
    end;
    for i:= 0 to 5 do
      ListBox1.Items.Add(Format('%d - %d',[Integer(Stack.Pop),Integer(Queue.Pop)]));
  finally
    Stack.Free;
    Queue.Free;
  end;
end;

Saludos :)


La franja horaria es GMT +2. Ahora son las 20:30:42.

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