¿Cómo puedo capturar variables por un método anónimo cuando lo uso en OTL?
Lo que quiero hacer:
Tengo algunos objetos en una lista genrica. Quiero capturar cada uno de estos objetos en un método anónimo y ejecutar este método como una tarea OTL separada.
Este es un ejemplo simplificado:
program Project51;
{$APPTYPE CONSOLE}
uses
SysUtils, Generics.Collections, OtlTaskControl, OtlTask;
type
TProc = reference to procedure;
type
TMyObject = class(TObject)
public
ID: Integer;
constructor Create(AID: Integer);
end;
constructor TMyObject.Create(AID: Integer);
begin
ID := AID;
end;
var
Objects: TList<TMyObject>;
LObject: TMyObject;
MyProc: TProc;
begin
Objects := TList<TMyObject>.Create;
Objects.Add(TMyObject.Create(1));
Objects.Add(TMyObject.Create(2));
Objects.Add(TMyObject.Create(3));
for LObject in Objects do
begin
//This seems to work
MyProc := procedure
begin
Writeln(Format('[SameThread] Object ID: %d',[LObject.ID]));
end;
MyProc;
//This doesn't work, sometimes it returns 4 lines in console!?
CreateTask(
procedure(const Task: IOmniTask)
begin
Writeln(Format('[Thread %d] Object ID: %d',[Task.UniqueID, LObject.ID]));
end
).Unobserved.Run;
end;
Sleep(500); //Just wait a bit for tasks to finish
Readln;
end.
Y este es el resultado:
Como puede ver, la captura parece funcionar bien en el hilo principal. Sin embargo, no sé si se ha capturado un puntero a un objeto o solo su campo de ID.
Cuando intento capturar el objeto y pasar el método anónimo aCreateTask
Las cosas de la función se vuelven raras.
En primer lugar, solo la tercera instancia deTMyObject
Parecía ser capturado. En segundo lugar, tengo cuatro mensajes en el registro de la consola a pesar de que solo tengo tres objetos en la lista genérica. El segundo comportamiento es inconsistente, a veces tengo tres mensajes en la consola, a veces tengo cuatro.
Explíqueme la razón de los dos problemas mencionados anteriormente y proponga una solución que elimine el problema y me permita pasar cada instancia de objeto a una tarea OTL separada. (No quiero usar regularTThread
clase.)