Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: CL | DM;

Вниз

Корректное удаление потока (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
6-1143832549
Новочеркасский Волк
2006-03-31 23:15
2006.08.20
Проводник удалённого компьютера.


1-1152014326
race1
2006-07-04 15:58
2006.08.20
TXMLDocument проблемы


1-1152085849
JohnnySE
2006-07-05 11:50
2006.08.20
работа с DLL и ее интерфейсами


15-1153836536
oldman
2006-07-25 18:08
2006.08.20
Последний день работы...


2-1154196824
Gnoll
2006-07-29 22:13
2006.08.20
програмно открыть доступ к ресурсам