У меня есть программа, которая использует Thread, который выполняет некоторую работу. Нить должна уведомить другой поток (в этом примере основной поток) о прогрессе.Обработка локальной переменной в анонимной процедуре, переданной в TThread.Queue
Если я использую Синхронизировать() для выполнения синхронизации все работает должным образом. Если синхронизировать с основным потоком и опубликовать переменной для и поместить его в список каждый значение приобретают напечатанная правильно в моем ListBox:
procedure TWorkerThread.Execute;
var
i: Integer;
begin
inherited;
for i := 1 to 1000 do
begin
Synchronize(
procedure()
begin
FireEvent(i);
end);
end;
end;
Выход: 1, 2, 3, 4, 5. .. 1000
Если я использую Очередь() для выполнения синхронизации на выходе не ожидается, как:
procedure TWorkerThread.Execute;
var
i: Integer;
begin
inherited;
for i := 1 to 1000 do
begin
Queue(
procedure()
begin
FireEvent(i);
end);
end;
end;
Выход: 200, 339, 562, 934, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, [...]
Что здесь происходит? Насколько я понимаю, анонимная процедура должна фиксировать переменную «i»?
PS: Я знаю, что это не имеет смысла обновлять интерфейс. Я просто хочу знать, что изменяет содержимое переменной, но метод anonymouse должен фиксировать значение. –
Вы фиксируете переменную. Но вы пытаетесь захватить «ценность». Поэтому вам нужно создать новую переменную, по одной для каждой итерации цикла, и захватить ее. Для этого требуется новый стек стека и, следовательно, вызов функции. Что приводит к коду в ответе LURD. –