Как я могу захватывать переменные анонимным методом при использовании его в OTL?
Что я хочу сделать:
У меня есть несколько объектов в списке родов. Я хочу захватить каждый из этих объектов в анонимном методе и выполнить этот метод как отдельную задачу OTL.
Это упрощенный пример:
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;
LObject: TMyObject;
MyProc: TProc;
begin
Objects := TList.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.
И вот результат:
Как видите, захват в основном потоке работает нормально. Тем не менее, я не знаю, был ли захвачен указатель на объект или только его поле идентификатора?
Когда я пытаюсь захватить объект и передать анонимный методCreateTask
Функциональные вещи становятся странными.
Прежде всего, только третий экземплярTMyObject
казалось захваченным. Во-вторых, яУ меня четыре сообщения в консольном журнале, несмотря на то, что у меня всего три объекта в общем списке. Второе поведение противоречиво, иногда яу меня в консоли три сообщения, иногда яу нас четыре.
Пожалуйста, объясните мне причину двух проблем, упомянутых выше, и предложите решение, которое устраняет проблему и позволяет мне передавать каждый экземпляр объекта в отдельную задачу OTL. (Я не хочу использовать обычныеTThread
учебный класс.)