Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Корректное удаление потока (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 тоже убери если есть.


Наверх

Титульная страница Поиск, карта сайта Написать письмо