Добрый день!
Прочитал много всего про потоки, в том числе и на этом форуме.
Но не могу понять как правильно реализовать мою задачу.
Максимально упрощенная задача:
Нужно выполнять параллельно несколько потоков, которые меняют свойство progress компонента-бегунка TGaude.
Как я пытаюсь сделать:
Есть форма с TGaude на нем.
Есть поток:
type
TThreadMyForm = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
FMyForm : TMyForm; //Ссылка на форму
end;
Я создаю поток suspended = true, после создания присваиваю его публичному свойству FMyForm ссылку на только что созданную форму, и запускаю на выполнение:
myForm := TMyForm.Create(Application);
threadMyForm := TThreadMyForm.create(true);
with threadMyForm do
begin
freeOnTerminate := true;
FWebForm := webForm;
FMyForm := myForm;
Resume;
end;
В самой форме описана процедура изменения ползунка. И этот метод я вызываю в цикле Execute потока.
procedure TMyForm.actionChangeGaude(milisek : integer);
var
i: Integer;
begin
gaude.Progress := 0;
gaude.MaxValue := milisek;
for i := 0 to milisek do
begin
sleep(100);
gaMain.Progress := i;
Application.ProcessMessages;
end;
end;
Этот метод не знает что он вызван в Execute потока.
Я не понимаю как нужно сделать возможность безопасного закрытия формы пользователем в момент выполнения потока.
Когда я просто закрываю форму - поток остается работать, и пытается что то менять на уже уничтоженной форме. (Форма уничтожается в момент закрытия).
Т.е. конечно же нужно перед закрытием формы уничтожить поток, который на этой форме что то делает.
Следовательно - форма должна знать о потоке.
Следовательно - после создания потока я указываю его как значение поля формы FMyThread:
myForm.FThread := myThread as TThread;
И в onclose формы делать так:
FThread.Terminate;
FThread.WaitFor;
FThread.Free;
Но эксперименты показывают что это все неправильно, ибо вылазит ошибка на WaitFor : "Неверный дескриптор"
Ну и то что поток вызывает метод формы, который описан в самой форме, и который не знает что его вызвал поток - это кмк тоже неправильно.
Какая должна быть правильная архитектура такой задачи?