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. |