Форум: "Основная";
Текущий архив: 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