Skip to content

ThreadVar, el lado oscuro de las variables 

La palabra clave ThreadVar inicia un conjunto de definiciones de variables que utilizan los subprocesos.

Cada subproceso recibe una instancia por separado de cada variable, lo que evita conflictos de datos entre ellos y preserva la independencia del subproceso.

Una dato a tener en cuenta cuando utilizamos ThreadVar, es que dichas variables se liberarán automaticamente de la memoria, siempre y cuando sean de un tamaño fijo, por ejemplo si son de tipo float, integer, char, etc. Las cadenas, las matrices dinámicas y las interfaces entre otro tipos dinámicos no se liberarán automáticamente.

Ejemplo de ThreadVar

var
  Form1: TForm1;

ThreadVar
  MyThreadVar: integer;

implementation

{$R *.dfm}

procedure TForm1.examplethreadvar;
var
  I: integer;
begin
  for I := 0 to 5 do
  begin
    TThread.CreateAnonymousThread(
      procedure
      var
        J: integer;
        s: string;
      begin
        MyThreadVar := random(100);

        for J := 0 to 5 do
        begin
          Sleep(100);

          s := MyThreadVar.ToString;
          TThread.Queue(nil,
          procedure
          begin
            ShowMessage(s);
          end
          );
        end;
      end).Start;
  end;
end;

En el ejemplo anterior, podemos ver que cada uno de los subprocesos, obtiene su propio núnero aleatorio y dicha secuencia se repite en las cinco veces del bucle for.

Por ende verificamos que con una misma variables, se carga con un dato diferente en cada uno de los subprocesos.