![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректное удаление потока (TThread) [D7, WinXP]
Chaser © (2006-07-04 10:06:00)В программе в отдельной форме в 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 17:39:00) [1]TerminateThread(GetProp.Handle); очень не рекомендовал бы. Только если за ним последует выход из программы.
второе явление Чапаева народу (2006-07-04 11:45:00) [2]
> TerminateThread(GetProp.Handle, 0);
> GetProp.Terminate;
Это ещё зачем?
Пусик (2006-07-04 11:14:00) [3]В этом коде -
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]Да в коде то как раз ничего
> сверхестественного нет.
А и не должно быть ничего сверхестественного для того, чтобы ошибки возникали.
Chaser (2006-07-04 10:28:00) [4]
> Пусик © (04.07.06 10:17) [4]
Да в коде то как раз ничего сверхестественного нет.
Chaser (2006-07-04 10:24:00) [5]Ну так ведь поток еще не отработал
if thr_run=true // тут идет проверка, отработал поток или нет
then
begin
TerminateThread(GetProp.Handle, 0);
GetProp.Terminate;
GetProp.Free;
end;
DVM (2006-07-04 10:23:00) [6]
> Да мне FreeOnTerminate тоже нужен
тогда зачем пишешь GetProp.Free?
DVM (2006-07-04 10:23:00) [7]
> И чем плох FreeOnTerminate?
Непредсказуемыми глюками во многих случаях.
Пусик (2006-07-04 10:17:00) [8]
> Chaser © (04.07.06 10:14) [3]
Судя по всему, у тебя ошибка в реализации потока. Если код не очень большой, было бы неплохо посмотреть.
Chaser (2006-07-04 10:14:00) [9]Да мне FreeOnTerminate тоже нужен, так как если поток отработает до принудительного закрытия формы, он должен уничтожиться сам.
И чем плох FreeOnTerminate?
DVM (2006-07-04 10:10:00) [10]
> Если поток еще не отработал,
Как правило в потоке есть цикл в него надо вставить проверку на Terminated и выход из цикла. Если цикла нет - делать нечего надо ждать.
DVM (2006-07-04 10:09:00) [11]
> Есть соображения по данной реализации?
Плохая реализация
GetProp.Terminate;
GetProp.WaitFor;
GetProp.Free;
TerminateThread убери и FreeOnTerminate := true тоже убери если есть.