Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.042 c
15-1153845017
oldman
2006-07-25 20:30
2006.08.20
Как съезжают программисты...


15-1153584712
WC2
2006-07-22 20:11
2006.08.20
Как вы представляете дни недели?


15-1153658347
ronyn
2006-07-23 16:39
2006.08.20
сообщения принтера


4-1146143771
tytus
2006-04-27 17:16
2006.08.20
Какое сообщение указывает, что в ListBox-e появился скролбар?


10-1122987874
Mx
2005-08-02 17:04
2006.08.20
Предоставление информации об интерфейсах





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский