Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
Прямой   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
14-72876
aLL
2004-01-03 20:56
2004.01.23
Помогите в написании. программы.


1-72799
Прямой
2004-01-13 04:09
2004.01.23
Убиваю поток, а ресурсы не освобождаются.


3-72685
WG
2003-12-25 10:21
2004.01.23
Можно ли не ставит Borland DBE ?


1-72814
qwert
2004-01-12 16:30
2004.01.23
ValueListEditor


3-72688
kirov_igor
2003-12-24 12:54
2004.01.23
Поиск по набору данных





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