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

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

Как правильно завершить поток и... [D6, WinXP]


Andrew Klochko ©   (2002-10-29 23:49:00) 

Как правильно завершить поток и освободить занимаемую им память - в примере, описанном ниже, если код MyThrd.Terminate; MyThrd.Free; после выхода из потока вешает компьютер. При отработке кода до конца (без принудительного останова) никаких проблем не возникает.

Пример:
Procedure TMyThread.Execute;
Begin
…………….
Recurs(….);
……………
End;

Procedure TMyThread.Recurs(…..);
Begin
…………….
Recurs(….);
……………
End;


Юрий Зотов   (2002-10-30 08:54:00) [1]

Андрей, не стоит смешивать в одну кучу потоки Windows и дельфишный объект TThread, это не совсем одно и то же. Если уж Вы пользуетесь TThread"ом, то не следует напрямую вызывать ExitThread. Для завершения потока используйте его свойства и методы, а ExitThread он сам вызовет (тогда, когда ему это будет нужно, там не все так просто - и именно по этой причине не нужно вызывать ExitThread напрямую). А для передачи кода завершения можно использовать ReturnValue.


SottNick   (2002-10-30 07:16:00) [2]

if MyThrd<>nil
then
begin
MyThrd.Suspend;
MyThrd.Free;
MyThrd:=nil;
end;

должно помочь
при принудительном завершении потока память почему-то не освобождается
ЕСЛИ РЕШИШЬ ПРОБЛЕМУ, НАПИШИ


Andrew Klochko   (2002-10-30 01:11:00) [3]

Ну почему замолчали ????


Andrew Klochko   (2002-10-30 00:33:00) [4]

Но!
Procedure TMyThread.Recurs(…..);
Begin
…………….
If Terminated then ExitThread(XXX);
Recurs(….);
……………
End;

Условие не выполняется!!!, т.е. при MyThrd.Terminate выход из потока происходит в каком-то другом месте, т.е. код выхода не равен ХХХ


Юрий Зотов   (2002-10-30 00:11:00) [5]

Procedure TMyThread.Recurs(…..);
Begin
…………….
if not Terminatedthen Recurs(….);
……………
End;

И, вероятно, будет лучше вместо явного MyThrd.Free использовать FreeOnTerminate. Тогда объект уничтожится сам собой, достаточно будет просто сказать MyThrd.Terminate - и все.


Наверх

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