| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Утечки в TThread |
| Автор: aktuba 16.4.2007, 06:16 | ||||
Ужас... Всю ночь ковырял код, искал утечки памяти в своем коде (правда, заодно и оптимизировал =))), а утечка оказалась в TThread. Смотрите, вот основной модуль программы:
а вот юнит потока:
Как Вы можете видеть, этот код не делает вообще ничего (кроме как грузит проц =))), но утечки получаются бешенные. Кто сталкивался? Как пофиксить???? |
| Автор: bazzzman 16.4.2007, 07:15 |
| Сам не сталкивался. Может это поможет? http://qc.borland.com/wc/qcmain.aspx?d=9223 И еще: очень интересно чем замеряешь утечки памяти? TaskMan? |
| Автор: aktuba 16.4.2007, 08:03 | ||
Да, в основном TaskMan... Да и замерять не стоит сильно. Запусти этот код на пару часов, получишь Out of Memory... P.S.: к сожаление не помогло =(((( |
| Автор: ama_kid 16.4.2007, 10:33 |
| Странно... Запустил предоставленный код - не получил утечек вообще, тем более не получил "бешенных" утечек (замерялось по TaskMan). Только среда (дельфи 7) потекла (возможно, глючит режим отладки). При автономном запуске приложения - никаких утечек вообще. P.S. Если ты используешь Resume и WaitFor - тогда создавать поток надо с CreateSuspended = true (хотя у тебя это все и обрамлено блоком try...except...end)... |
| Автор: Snowy 16.4.2007, 10:45 |
| aktuba, 7-ка патченная? Утечка в Tthread - бага известная. Точно не скажу, но вроде лечится накатыванием сервиспака. А может и нет... Я давно уж на турбе пишу. Там этой баги точно нет. |
| Автор: aktuba 16.4.2007, 11:29 |
| Snowy, есть там эта утечка!!! я тоже на Турбе пишу... |
| Автор: Alexeis 16.4.2007, 12:00 |
| Я проверил BDS без паков. Тоже чисто. |
| Автор: Yanis 16.4.2007, 12:33 |
| Да всё нормально. Просто «Диспетчер задач» фтопку Он не отображает реальной картины. |
| Автор: skyboy 16.4.2007, 14:22 |
а как быть с ? aktuba, другие компиляторы пробовал? а на других компах запускать? |
| Автор: evgeniikim 16.4.2007, 14:29 | ||||||||
| Трудно ответить наверняка в чем может быть бага, но я привык их избегать писать код явно и правильно, без мыслей типа "при первом использовании переменной integer она всегда должна быть 0 - не всегда, бывает и по другому"- поэтому все ставлю InterlockedExchange(переменная,0); - это наглядная философия. а вот код, практически такой же как у тебя, только с небольшими поправками: Вызов:
Сама нить:
Прекрасно работает на: Delphi 7 + сервис паки (7.1 версия получается) Delphi 2006 + SP1+SP2 Delphi 2007 под явным указанием я имею в виду, я не полагаюсь на автоматические конструктор и деструктор потока, выше я их описал, и еще небольшая ошибочка, я даже сказал не ошибочка, а недоразумение:
Если хочешь использовать Resume, то сделай так:
так же я явно указал FreeOnTerminate:=false, в твоей реализации нужно поставить именно так. Если придерживаться правильности и ясности кода, дожно быть все ОК! Удачи! |
| Автор: aktuba 16.4.2007, 16:52 | ||||||
D7, TD...
на ноуте и на работе...
торопился. писал в браузере, а не переносил с редактора, отсюда и небольшое недоразумение... |
| Автор: evgeniikim 16.4.2007, 22:53 |
| Так что? так проблема и осталась? Если проблема осталась, нужно найти другой компилятор(релиз Дельфи) или поставить максимальный сервис пак. Утечек здесь не должно быть. |