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

Вниз

Убиваю поток, а ресурсы не освобождаются.   Найти похожие ветки 

 
Прямой   (2004-01-13 04:09) [0]

Создаю поток API функцией CreateThread. Функция потока засасывает файл например так ttt.LoadFromFile("...");
Потом долго и нудно "лопатит" этот ttt.
И если в момент перелопачивания списка строк из родительского потока вызвать TerminateThread, то выделенная память под ttt не освобождается, хотя создаю этот список внутри функции потока.
Подскажите где не так.


 
Babay ©   (2004-01-13 04:56) [1]

Может лучше не через API, а написать наследника от TThread...


 
Прямой   (2004-01-13 05:00) [2]

Нет не лучше.


 
y-soft ©   (2004-01-13 07:38) [3]

>Прямой (13.01.04 05:00) [2]

Все правильно - TerminateThread это колун, который убивает поток мгновенно, не дожидаясь, пока завершится его функция, при этом память, выделенная внутри потока, естественно не освобождается

Обратите внимание, что в Delphi приложение ожидает завершения функций всех выполняющихся потоков (это одна из причин создания класса TThread)

Прямое использование CreateThread создает сразу несколько проблем:

1. Для функции потока не инициализируется RTL
2. Не инициализируются внутренние структуры Delphi (например, не устанавливается переменная IsMultiThreaded в System, что вызывает неправильную работу менеджера памяти)
3. Не инициализируется внутрипоточная обработка исключений

Если все-таки нет желания использовать TThread (это, действительно, не лучшее творение Borland :)) ), то используйте вместо CreateThread BeginThread, а для штатного завершения - EndThread. TerminateThread используйте только для аварийного завершения функции потока


 
y-soft ©   (2004-01-13 07:43) [4]

Да, и не забудьте поместить код функции потока в try..finally


 
Прямой   (2004-01-13 07:47) [5]

Буду пробовать.
y-soft ©
Еще вопрос.
Внутри функции потока создавать
ttt:=TStringList.Create;
ttt.LoadFromFile("*****");

Работаем с ttt

ttt.Free;
Проблема в том что если вызвать ещё одну нить с той же функцией, то эти две функции потоков не могут корректно поделить между собой ttt, какие стандартные решения этой проблемы?


 
y-soft ©   (2004-01-13 07:49) [6]

Стандартное решение - использование объектов синхронизации для доступа к совместно используемым объектам. Внутри одного процесса чаще всего используются критические секции


 
y-soft ©   (2004-01-13 07:59) [7]

Если и с критическим секциями хотите работать средствами WinAPI, то посмотрите описание функций InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection, DeleteCriticalSection


 
Прямой   (2004-01-13 08:03) [8]

У меня вся функция потока и есть один большой объект синхронизации, а если серьезно, то внутри этой функции много вложенных процедур использующих в частности списки строк в том числе и в качестве передаваемых параметров вложенных процедур.
А хотелось бы что-бы эта потоковая функция как бы сама создавала экземпляры этих объектов. Может что присоветуете?


 
y-soft ©   (2004-01-13 08:12) [9]

Объект синхронизации как правило создается в первичном потоке один раз в начале программы и уничтожается в конце программы

И каждое обращение из любого потока к совместно используемому объекту заключается в примерно такой код:


...
EnterCriticalSection(...)
try
//Делаем что-то с объектом
finally
LeaveCriticalSection(...)
end;



Страницы: 1 вся ветка

Текущий архив: 2004.01.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
3-72685
WG
2003-12-25 10:21
2004.01.23
Можно ли не ставит Borland DBE ?


14-72918
Saimon
2004-01-02 05:36
2004.01.23
Как в Win9x сделать форму прозрачной?


4-72967
DillerXX
2003-11-19 15:16
2004.01.23
Как мне на любое нажатие текстовых клавиш на клавиатуре выполнять


14-72886
Delphin
2004-01-03 16:58
2004.01.23
Hi! Возможно ли дописать в мр3 файл информацию о группе, альбоме,


1-72706
pirat
2004-01-12 10:19
2004.01.23
установка своего скринсейвера как текущего