Главная страница
    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.04 c
1-1152080166
ancot
2006-07-05 10:16
2006.08.20
Цвет TMainMenu


1-1151851802
AlexeyT
2006-07-02 18:50
2006.08.20
Глюк отрисовки (гориз. полосы) в TListView: ???


2-1154013757
AHoja
2006-07-27 19:22
2006.08.20
замена символов в файле пропуском


4-1146397145
zaN0za
2006-04-30 15:39
2006.08.20
Вопрос по потокам


15-1153908559
Virgo_Style
2006-07-26 14:09
2006.08.20
проблема с Mass Storage Device (драйвера?)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский