Такая проблема: программа работает в многопоточном режиме. Всего три разновидности потока. Один из них запускается множество раз и в реальном времени в среднем работает в 50-и экземплярах. Так вот в этих потоках при завершении действия я убиваю отслужившие свое объекты, но это не помогает. Пробовал в конце кода добавлять следующую строку: self.terminate; Но не помогло. Как быть и что делать?
Ну где-то значит не убивается, или в используемом классе деструктор кривой, по очередно по убирай обьекты и смотри где что не так.
Уже пробовал убивать все что только можно. Заметил, что занимаемая оперативка не всегда прибавляется, бывает и скачет вниз. Возможно-ли, что на 50 потоков столько оперативки и выходит, если там используются Indy, RegEx и т.д.?
Необязательно память загружается объектами потока. Возможно ты в какое-нибудь Memo грузанул хуеву тучу строк допустим из файла, или там в tstringlist.
Diamantx, в конструкторе класса потока или при создании экземпляра нужно установить свойство FreeOnTerminate в true. 99% ты забыл это сделать. Если версия Delphi не ниже XE, то в самом начале программы вставь строчку Code: ReportMemoryLeaksOnShutdown := true; Хотя бы при выходе из программы увидишь что не удаляешь из памяти.
Нашел проблемный кусок кода: Code: RegEx := TRegEx.Create ('<defindex>\d{1,15}</defindex>\s*<level>\d{1,15}</level>\s*<quality>\d{1}</quality>'); M := RegEx.Matches(user_info); for s := 0 to M.Count - 1 do begin item_id := M.Item[s].Value; item_id := copy(item_id, pos('<defindex>', item_id) + 10, 50); delete(item_id, pos('</defindex>', item_id), 150); quality := M.Item[s].Value; quality := copy(quality, pos('<quality>', quality) + 9, 50); delete(quality, pos('</quality>', quality), 200); users_items.add(user_id + ':' + item_id + ':' + quality); end; Если закомментировать строку M := RegEx.Matches(user_info); , то занимаемая оперативка держится на 20мб. RegEx - встроенный компонент в XE5. Как быть?
Подозреваю, что должно быть хотя бы так: Code: RegEx := TRegEx.Create('<defindex>\d{1,15}</defindex>\s*<level>\d{1,15}</level>\s*<quality>\d{1}</quality>'); try M := RegEx.Matches(user_info); if Assigned(M) then try for s := 0 to M.Count - 1 do begin item_id := M.Item[s].Value; item_id := copy(item_id, pos('<defindex>', item_id) + 10, 50); delete(item_id, pos('</defindex>', item_id), 150); quality := M.Item[s].Value; quality := copy(quality, pos('<quality>', quality) + 9, 50); delete(quality, pos('</quality>', quality), 200); users_items.add(user_id + ':' + item_id + ':' + quality); end; finally M.Free; end; finally RegEx.Free; end;