Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизУбиваю TThread. Нужен совет :) Найти похожие ветки
← →
Alx2 © (2004-11-03 23:59) [0]В главной форме рождение и смерть объекта - представителя потомка класса 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?
← →
Игорь Шевченко © (2004-11-04 00:28) [1]
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 так
← →
Alx2 © (2004-11-04 09:43) [2]>Игорь Шевченко © (04.11.04 00:28) [1]
Спасибо. Вроде-бы понял, что на верном пути :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.04 c