Главная страница
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.02 c
4-72984
Antarion
2003-11-13 18:37
2004.01.23
Первый раз юзаю winApi


3-72668
senya
2003-12-26 19:12
2004.01.23
Есть ли какая-нить альтернатива DBChart ?


14-72939
Rauf
2003-12-29 21:58
2004.01.23
Где можно скачать NFS 1-й, да да именно первый???


3-72662
Skif
2003-12-25 19:02
2004.01.23
BDE+ODBC+MySQL - ошибка при выполнении запроса


3-72657
Orxan
2003-12-26 11:36
2004.01.23
Функция ApplyUpdates(). в ClientDataSet