Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2015, 11:02   #1
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию Освобождение памяти

Есть поток (основной) который постоянно запускает другие потоки, эти потоки записывают в переменные которые прописаны в threadvar некие данные, после чего завершают работу, в диспетчере задач используемая память постоянно увеличивается, и я думаю то что это изза того что переменные не очищаются после завершения работы потока, как собстна их почистить? все что использовал данный поток необходимо просто удалить....
Судя по недавним полученным знаниям я предполагаю что
Код:
i.Free;
мне не подойдет, ибо эту переменную даже учитывая то, что она прописана в threadvar больше использовать не получится....
а вот
Код:
i.Clear;
не подойдет ибо переменная будет пуста но будет существовать и занимать память..
есть предположение что мне поможет что то вроде:
Код:
Free;
в конце выполнения потока... который удалит все и вся, включая используемые переменные...
только вот у меня есть обработка исключительных ситуаций, в некоторых из них есть завершение работы потока, с помощью exit, как мне можно будет очистить память при завершении потока? может что то вроде:
Код:
potok.OnTerminate begin
 Free;
end;
только вот надо чтобы он чистил память не у всех запущенных потоков с данным именем а только именно у этого
кстати FreeOnTerminate=true у меня стоит для каждого запускаемого потока, это как я понял должно обеспечить корректное удаление всех используемых данных у потока
и еще вопрос:
представим код:
Код:
try
 try
  //тут какую нить ошибку вызовем
 except
  //выводим сообщение 1
 end;
except
//выводим сообщение 2
end;
выведутся оба сообщения или только 1?
Что будет если код будет таким:
Код:
try
 try
  //тут какую нить ошибку вызовем
 except
  exit;
 end;
finally
//выводим сообщение
end;
сообщение выведется?

Последний раз редактировалось vipok72; 04.08.2015 в 11:56.
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 12:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Можно увидеть твой боевой код?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.08.2015, 12:19   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
кстати FreeOnTerminate=true у меня стоит для каждого запускаемого потока, это как я понял должно обеспечить корректное удаление всех используемых данных у потока
Это обеспечит корректный запуск деструктора данного объекта-потока (Destroy).
А дальше надо смотреть КАК написан твой Destroy. Обеспечивает ли он корректное удаление созданных объектов? Видимо нет.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.08.2015, 12:27   #4
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Можно увидеть твой боевой код?
Запускаем потоки
Код:
for i:=1 to 10 do begin
	With potok.Create(True) do begin
		FreeOnTerminate:=true;
		//тут передаем кое что потоку
		Resume;
	end;
end;
работа потока
Код:
procedure potok.Execute;
begin
//тут бесчисленные try ... except exit; end;
end;
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 12:29   #5
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Это обеспечит корректный запуск деструктора данного объекта-потока (Destroy).
А дальше надо смотреть КАК написан твой Destroy. Обеспечивает ли он корректное удаление созданных объектов? Видимо нет.
Вы правы, нет, я так понимаю для этого и понадобится OnTermonate?
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 12:41   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Код:
/тут передаем кое что потоку
У меня волосы на лысине поднимаются! Поток уже открыт, а тут, ещё кое-что ему передают! Ужас!
Если поток открыт, здесь уже ничего сделать нельзя. Либо пиши в него, либо закрываЙ. Да, несколько потоков, можно открыть, но речь наверное, об одном?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.08.2015, 12:51   #7
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Код:
/тут передаем кое что потоку
У меня волосы на лысине поднимаются! Поток уже открыт, а тут, ещё кое-что ему передают! Ужас!
Если поток открыт, здесь уже ничего сделать нельзя. Либо пиши в него, либо закрываЙ. Да, несколько потоков, можно открыть, но речь наверное, об одном?
пишу в него, я ошибся, речь об одном
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 13:00   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от vipok72 Посмотреть сообщение
пишу в него, я ошибся, речь об одном
Давай так. Мои шутки, они и есть - шутки. Но, если по-серьёзному. Можно открыть, хоть 100500 потоков. Вопрос: нужны-ли они? Я обхожусь двумя-тремя. Над четвёртым уже задумываюсь "а нахрен он нужен". Действительно, оказавается и нахрен не нужен.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 04.08.2015, 13:02   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Не надо Exit внутри except...end: прокатить - прокатит, но может породить плавающую ошибку. Лет 100500 назад читал где-то и запомнил.

FreeOnTerminate гарантирует освобождение памяти только из-под самого объекта. Если он в процессе работы наклянчил у системы ещё какую-то память, то он должен отдать её при разрушении - например в деструкторе.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.08.2015, 14:04   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Код:
/тут передаем кое что потоку
У меня волосы на лысине поднимаются! Поток уже открыт, а тут, ещё кое-что ему передают! Ужас!
Если поток открыт, здесь уже ничего сделать нельзя. Либо пиши в него, либо закрываЙ. Да, несколько потоков, можно открыть, но речь наверное, об одном?
1-ое) это поток не данных, а поток исполнения, в него ничего не пишут.
2-ое) поток спит во время передачи.

ТС, как сказали выше ваш поток должен сам за собою подчищать, а ему для этого события не нужны.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 04.08.2015 в 14:07.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освобождение памяти Smolya Общие вопросы C/C++ 4 23.02.2015 19:38
Освобождение памяти SAMOUCHKA Общие вопросы по Java, Java SE, Kotlin 7 26.01.2014 21:24
Освобождение памяти millepetrozza Общие вопросы C/C++ 4 27.10.2012 15:13
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23