Главная страница
    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.043 c
15-1153485325
разводящий
2006-07-21 16:35
2006.08.20
Гипноз


15-1153421716
Vendict
2006-07-20 22:55
2006.08.20
Клиент


1-1151993205
Chaser
2006-07-04 10:06
2006.08.20
Корректное удаление потока (TThread)


15-1153841744
0bsid
2006-07-25 19:35
2006.08.20
Ctrl+Shift+Space :(


1-1152080005
Zilog_
2006-07-05 10:13
2006.08.20
Нужна помощь в переводе файлов заголовков из С++ в Delphi





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