![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Убиваю TThread. Нужен совет :)
Alx2 © (2004-11-03 23:59:00)В главной форме рождение и смерть объекта - представителя потомка класса TThread - представлены так:
constructor TMainForm.Create(Owner: TComponent);
begin
inherited;
Solver := TGUISolver.Create(Memo, LengthEdit, DifferenceEdit, StringGrid); // Создаем в режиме Suspended
end;
destructor TMainForm.Destroy;
begin
Solver.Free; // Убиваем еще работающий поток
inherited;
end;
end;
Вот рабочее тело:
procedure TSolver.Execute; // предок TGUISolver, потомок TThread
begin
repeat
WaitForSingleObject(Event.Handle, INFINITE); // Событие, ожидающее команды на запуск некоторого алгоритма с измененными параметрами
if not isOwnerDead then // если форма, в контролы которой шлем лог еще жива
try
Synchronize(FillData); // Посылка лога
State := ssRunning;
Solve; // Что-то вычисляем некоторым алгоритмом
State := ssWaiting;
except
NeedForStop := True;
end;
until isOwnerDead or Terminated;
end;
Вопрос:
Во время убиения формы вызывается Solver.Free в то время, когда он еще активен.
Корректна ли следущая реализация деструктора:
destructor TSolver.Destroy;
begin
............ // Некоторый код для создания условий к выходу из цикла в Execute.
WaitFor; // - Ждем завершения потока
Event.Free;
inherited; // Помираем.
end;
Конкретнее: уместен ли тут WaitFor?
Alx2 (2004-11-04 09:43:00) [1]>Игорь Шевченко © (04.11.04 00:28) [1]
Спасибо. Вроде-бы понял, что на верном пути :)
Игорь Шевченко (2004-11-04 00:28:00) [2]
destructor TThread.Destroy;
begin
if (FThreadID <> 0) and not FFinished then
begin
Terminate;
if FCreateSuspended then
Resume;
WaitFor;
end;
if FHandle <> 0 then CloseHandle(FHandle);
.....
end;
в D6 так