Игорь, Это код создания, а вот когда вы ссылку присваиваете переменной FDQueryUrl, которая глобальна для нескольких потоков, вот там и начинаются проблемы. Как я уже сказал, решение - перенос переменной в секцию var, как у вас в последнем примере кода в комментариях.
Игорь, У вас одна переменная, в которую вы из 10 (условно) потоков записываете ссылку на объект. В итоге, вы потеряете 9 ссылок, которая в итоге будет перезаписана последним потоком (переменная-то одна!). И затем, все эти потоки будут работать с этой ссылкой, а затем 10 раз попытаются её удалить из памяти.
Игорь, Ну да, ничего хорошего - утечки памяти и использование одной и той же переменной из нескольких потоков сразу.
Я бы рекомендовал создавать свои, честные, классы-наследники от TThread и организовывать код по старинке. Использование анонимных процедур с такими вот обёртками удобно для небольших задач, когда писать свой класс просто лень и хочется по-быстрому реализовать идею. Но это подходит тем, кто хорошо понимает, что делает и как оно работает. А не первых порах, использование TThread поможет понять как оно работает, гораздо нагляднее.
Переменная FDQueryUrl хранится там, где она объявлена. В приведенном примере кода я её объявления не вижу, а значит она хранится за пределами потока. Чтобы хранилась внутри - она должна быть в секции var анонимной процедуры созданного потока.
Игорь, Вообще, Hemul GM дело говорит - раз уж вы обернули в Synchronize работу с разделяемым ресурсом, то дополнительных синхронизаций не требуется, т.к. всё и так будет выполняться в одном потоке и никаких гонок не будет. Соответственно, изначальная ошибка у вас была в том, что вы забыли обнулить счётчик перед использованием (ThreadCounter := 0;), как я и намекнул в самом первом комментарии.
P. S. Ответ оформлять лень, можете ответить самостоятельно.
kalapanga, Если у вас сейчас 10.3.1 и вы обновляетесь, то действует старая лицензия. Хотя ключ всё равно повторно высылали на почту, когда я загружал новый установщик.
TTask.Run(
procedure
begin
TThread.Synchronize(nil,
procedure
begin
(Sender as TButton).Text := 'Начал выполнение';
end);
Sleep(5000);
TThread.Synchronize(nil,
procedure
begin
(Sender as TButton).Text := 'Закончил выполнение';
end);
end
);
dollar, Не знаю, что вас устраивает, но undefined behavior значит, что такие операции выполнять нельзя. Вы же не хотите, чтобы результат работы вашей программы зависел от погоды на Марсе? Измените логику программы, чтобы такого не допускать.
у делфи нет инструментов для чтения физических секторов, только логических?
При чём тут вообще Delphi, если вы всё это на WinAPI пишите - CreateFile, ReadFile и всё прочее - это не функции делфи, это функции Windows, библиотеки Kernel32.dll. Соответственно и гуглить надо что-то вроде "winapi read physical disk sector" и если вдруг найдётся ответ на С/С++ (что скорее всего) не отворачиваться, а переводить код на Delphi.