Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизКорректное удаление потока (TThread) Найти похожие ветки
← →
Chaser © (2006-07-04 10:06) [0]В программе в отдельной форме в OnShow создаю поток:
GetProp:=TGetProperties.Create(true);
GetProp.FreeOnTerminate:=true;
GetProp.Priority:=tpNormal;
GetProp.Resume;
Поток предназначен для подсчета данных.
Если поток еще не отработал, и пользователь нажимает кнопку Close, то я уничтожаю поток таким образом:
if thr_run=true
then
begin
TerminateThread(GetProp.Handle, 0);
GetProp.Terminate;
GetProp.Free;
end;
Проблема:
Если закрывать форму именно таким образом (уничтожая поток) несколько раз, то после одного из закрытий формы приложение виснет.
Возможно я как-то некорректно уничтожаю поток, однако при этом никаких ошибок не выдается.
Есть соображения по данной реализации?
← →
DVM © (2006-07-04 10:09) [1]
> Есть соображения по данной реализации?
Плохая реализация
GetProp.Terminate;
GetProp.WaitFor;
GetProp.Free;
TerminateThread убери и FreeOnTerminate := true тоже убери если есть.
← →
DVM © (2006-07-04 10:10) [2]
> Если поток еще не отработал,
Как правило в потоке есть цикл в него надо вставить проверку на Terminated и выход из цикла. Если цикла нет - делать нечего надо ждать.
← →
Chaser © (2006-07-04 10:14) [3]Да мне FreeOnTerminate тоже нужен, так как если поток отработает до принудительного закрытия формы, он должен уничтожиться сам.
И чем плох FreeOnTerminate?
← →
Пусик © (2006-07-04 10:17) [4]
> Chaser © (04.07.06 10:14) [3]
Судя по всему, у тебя ошибка в реализации потока. Если код не очень большой, было бы неплохо посмотреть.
← →
DVM © (2006-07-04 10:23) [5]
> Да мне FreeOnTerminate тоже нужен
тогда зачем пишешь GetProp.Free?
← →
DVM © (2006-07-04 10:23) [6]
> И чем плох FreeOnTerminate?
Непредсказуемыми глюками во многих случаях.
← →
Chaser © (2006-07-04 10:24) [7]Ну так ведь поток еще не отработал
if thr_run=true // тут идет проверка, отработал поток или нет
then
begin
TerminateThread(GetProp.Handle, 0);
GetProp.Terminate;
GetProp.Free;
end;
← →
Chaser © (2006-07-04 10:28) [8]
> Пусик © (04.07.06 10:17) [4]
Да в коде то как раз ничего сверхестественного нет.
← →
Пусик © (2006-07-04 11:14) [9]В этом коде -
if thr_run=true then
begin
TerminateThread(GetProp.Handle);
GetProp.Terminate;
GetProp.Free;
end;
Ошибок нет. Единственное, надо переписать:if thr_run then
begin
TerminateThread(GetProp.Handle);
// GetProp.Terminate; //это лишнее.
GetProp.Free;
end;
> Chaser © (04.07.06 10:28) [8]
> > Пусик © (04.07.06 10:17) [4]Да в коде то как раз ничего
> сверхестественного нет.
А и не должно быть ничего сверхестественного для того, чтобы ошибки возникали.
← →
второе явление Чапаева народу (2006-07-04 11:45) [10]
> TerminateThread(GetProp.Handle, 0);
> GetProp.Terminate;
Это ещё зачем?
← →
DVM © (2006-07-04 17:39) [11]TerminateThread(GetProp.Handle); очень не рекомендовал бы. Только если за ним последует выход из программы.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c