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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2015, 18:24   #21
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Автор, лови.
Дисптечер задач показывает отваливание кусков памяти у proect1.exe при гибели очередного потока
Вложения
Тип файла: zip thread.zip (202.3 Кб, 8 просмотров)
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 04.08.2015, 18:37   #22
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Автор, лови.
Дисптечер задач показывает отваливание кусков памяти у proect1.exe при гибели очередного потока
Код:
destructor TMyThread.Destroy;
begin
  if Assigned(FStream) then FStream.Free;
  FStream := nil;
  SendMessage(FExtWND, $0700, FIndex, 1);  // 1- зануление. потока уже нет
  inherited;
end;
Я так понял в этом месте идет очистка
Но кроме FStream.Free я ничего не понял, но это не работает с переменной типа String например, а в строчке где
threads[message.WParam]:= nil;
я так понял идет освобождение памяти занятой включая и потоков?
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 18:57   #23
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

деструктор для удаление говна созданного в конструкторе.
Он вызывается при окончании работы потока или при сбое.
Перед тем, как поток закончит свой жизненный путь, я отсылаю сообщение в главную форму и зануляю его "ячейку" в массиве. Когда подохнут все потоки, можно занулить и весь массив.
Кроме того, в любой момент, можно в цикле вызвать метод Terminate для потока что приведёт к скоропостижной и одновременной гибели каждого из них с освобождением памяти

добавил к примочке кнопку на которой скоропостижное уничтожение всех неотработанных

Код:
procedure TForm1.Button2Click(Sender: TObject);
var i : integer;
begin
  for i:= 0 to Length(threads)-1 do
  if Assigned(threads[i]) then
   threads[i].Terminate;
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 04.08.2015, 19:10   #24
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
деструктор для удаление говна созданного в конструкторе.
Он вызывается при окончании работы потока или при сбое.
Перед тем, как поток закончит свой жизненный путь, я отсылаю сообщение в главную форму и зануляю его "ячейку" в массиве. Когда подохнут все потоки, можно занулить и весь массив.
Кроме того, в любой момент, можно в цикле вызвать метод Terminate для потока что приведёт к скоропостижной и одновременной гибели каждого из них с освобождением памяти

добавил к примочке кнопку на которой скоропостижное уничтожение всех неотработанных

Код:
procedure TForm1.Button2Click(Sender: TObject);
var i : integer;
begin
  for i:= 0 to Length(threads)-1 do
  if Assigned(threads[i]) then
   threads[i].Terminate;
end;
Т.е. для типа String будет достаточно или нет?
Код:
Peremennaya:=nil;
Как очистить то я так и не понял
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 19:31   #25
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Т.е. для типа String будет достаточно или нет?
в отличии от сишников мы паскалевцы не занимаемся анонизмом с буферами, байтами и строками. Тип string живёт в пределах той функции в которой он объявлен.
То есть если
Код:
function getvalue(....):....;
var str : string;
begin
  str := 'd;fka;fk;gfsdkg;sd';
end;

a := getvalue(b);
<< вот тут пеоеменной str уже нет в природе
другое дело с массивами. Если он статический всё нормально, если динамический
вот такой value : array of ТИП;
то в деструкторе (или по окончанию работы с ним) нужно делать
Finalize(переменная)
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 04.08.2015, 19:48   #26
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
в отличии от сишников мы паскалевцы не занимаемся анонизмом с буферами, байтами и строками. Тип string живёт в пределах той функции в которой он объявлен.
То есть если
Код:
function getvalue(....):....;
var str : string;
begin
  str := 'd;fka;fk;gfsdkg;sd';
end;

a := getvalue(b);
<< вот тут пеоеменной str уже нет в природе
другое дело с массивами. Если он статический всё нормально, если динамический
вот такой value : array of ТИП;
то в деструкторе (или по окончанию работы с ним) нужно делать
Finalize(переменная)
Я так понял Finalize и FreeMem это то что мне надо для очистки перменных типа: string, integer, float.
А как же насчет еще парочки:
ICefStringMultimap, ICefPostData, ICefRequest и ICefFrame?
Как их можно наверняка почистить?
Короче все переменные из threadvar засунул в Finalize, память занимаемая так и продолжает увеличиваться
в вашем примере кода переменная объявлена внутри самой функции а не в начале после type, threadvar нельзя объявлять в потоке вроде как

Последний раз редактировалось vipok72; 04.08.2015 в 20:00.
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 20:03   #27
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Зачем вообще огород городить комбинируя threadvar и ttread? Спокойно можно не использовать threadvar, не в этом месте обосновано её применение
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.08.2015, 20:16   #28
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Зачем вообще огород городить комбинируя threadvar и ttread? Спокойно можно не использовать threadvar, не в этом месте обосновано её применение
В моем случае легче всего делать это, поверьте
vipok72 вне форума Ответить с цитированием
Старый 04.08.2015, 22:37   #29
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от vipok72 Посмотреть сообщение
threadvar нельзя объявлять в потоке вроде как
а зачем?

Цитата:
ICefStringMultimap, ICefPostData, ICefRequest и ICefFrame?
вот с этого бы мусора и начинал тему.
Интерфейсы это единственный объект который программист не может принудительно освободить никогда, даже в однонитевом приложении/
мусор порождённый от IDispatch посредством OLE технологии удаляется через метод Release (_Release). В некоторых случаях, нужно вызывать встроенные конструкторы. Например на объекты MS Office нужно сначала вызывать Quit а потом занулять переменную без Release.
Короче, порождение от IDispatch это геморой 70-го уровня после которого может случится вот это
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 04.08.2015, 23:57   #30
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
а зачем?


вот с этого бы мусора и начинал тему.
Интерфейсы это единственный объект который программист не может принудительно освободить никогда, даже в однонитевом приложении/
мусор порождённый от IDispatch посредством OLE технологии удаляется через метод Release (_Release). В некоторых случаях, нужно вызывать встроенные конструкторы. Например на объекты MS Office нужно сначала вызывать Quit а потом занулять переменную без Release.
Короче, порождение от IDispatch это геморой 70-го уровня после которого может случится вот это
Кажется я справился со своей проблемой благодаря вам, дело в том что я в threadvar создавал переменную:
Код:
	IdHTTP1:TIdHTTP;
Достаточно было лишь в finally для потока прописать IdHTTP1.Free как память стала нормально освобождаться, спасибо вам!
vipok72 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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