La Web del Programador: Comunidad de Programadores
 
    Pregunta:  27187 - AYUDA CON TCRITICALSECTION !!!...
Autor:  joselito joselito
Hola, amigos.
Hace un tiempo, hice una pregunta sobre secciones criticas, y me respondieron que la que yo estaba utilizando por entonces (la TRTLCriticalSection), no era válidad para los Threads, y me respondieron que había que utilizar TCriticalSection... pero sigue sin funcionar.
Mi pregunta es: ¿Como utilizar CORRECTAMENTE una TCriticalSection?... Me refiero, cómo y cuándo poner Leave, Enter, Destroy, o InitializeCriticalSection.... Muchas gracias. Jose.

  Respuesta:  Julio Arias
Hola.
Te comento que la forma de usar un objeto TCriticalSection es la siguiente:

Codigo a poner en alguna parte que se ejecute en la thread principal del programa (por ejemplo, en el constructor del mainform).

----------
constructor TForm.Create(Owner: TComponent);
begin
inherited;
{GCriticalSection es un objeto global}
GCriticalSection:= TCriticalSection.Create;
end;
----------

Dónde lo destruímos? En algún lugar en donde estemos seguros que las threads secundarias ya fueron finalizadas ==> un buen lugar es el destructor del mainform.

-----------
destructor TForm.Destroy;
begin
GCriticalSection.Free;
GCriticalSection:= nil;
inherited;
end;
-----------

Ahora que ya tenemos creado nuestro objeto TCriticalSection, lo debemos usar cuando deseamos ejecutar un código que accede a memoria compartida por las threads del programa. Lo hacemos de la siguiente manera:

-----------
GCriticalSection.Enter;
try
{ acá ponemos el código que queremos proteger }
finally
GCriticalSection.Leave;
end;
----------

Bueno, espero que te sirva.

Chau.