Как найти утечку памяти?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Как найти утечку памяти?

Сообщение Matew » 22.02.2008 (Пт) 8:18

Есть вот такая процедура:
Код: Выделить всё
Sub RisovatKonstr(Konstr As Konstrukcia, Frm As Object, tpVydel As Vydel)
Dim hBmpPrev As Long, pbDocHeight As Long, pbDocWidth As Long
Dim ret As Long, pbDochDC As Long, hBmp As Long
pbDochDC = CreateCompatibleDC(GetDC(0))
pbDocHeight = 2000
pbDocWidth = 2000
hBmp = CreateCompatibleBitmap(GetDC(0), pbDocWidth, pbDocHeight)
If hBmp = 0 Then
    MsgBox "Пора перезагрузиться. :)"
    End
End If
hBmpPrev = SelectObject(pbDochDC, hBmp)
SetBkMode pbDochDC, TRANSPARENT
Ster pbDochDC, pbDocWidth, pbDocHeight' pbDochDC закрашивается цветом фона
Narisovat Konstr, pbDochDC, tpVydel' на pbDochDC рисуется рисунок
StretchBlt Frm.hdc, 0, 0, Frm.ScaleWidth, Frm.ScaleHeight, pbDochDC, 0, 0, pbDocWidth, pbDocHeight, vbSrcCopy
hBmp = SelectObject(pbDochDC, hBmpPrev)
ret = DeleteDC(pbDochDC)
DeleteObject hBmp
End Sub

Так вот перезагружаться приходится очень часто :( . Как найти, где утекает память? Может можно хоть временно отсрочить перезагрузку, наример создав другой битмап, когда этот обнуляется?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 22.02.2008 (Пт) 8:30

для какой цели сделано так:
Код: Выделить всё
hBmpPrev = SelectObject(pbDochDC, hBmp)
....
hBmp = SelectObject(pbDochDC, hBmpPrev)

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 22.02.2008 (Пт) 8:37

HiSER, копировал из очень старого проекта. Видать, хотел создать и вернуть на место. А как должно быть?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 22.02.2008 (Пт) 8:39

Например:
Код: Выделить всё
DeleteObject SelectObject(pbDochDC, hBmp)


Без:
Код: Выделить всё
hBmp = SelectObject(pbDochDC, hBmpPrev)

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 22.02.2008 (Пт) 8:48

HiSER
Не помогает ни так:
Код: Выделить всё
DeleteObject SelectObject(pbDochDC, hBmp)

ни так:
Код: Выделить всё
DeleteObject hBmpPrev

:(
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 22.02.2008 (Пт) 8:50

Полный код в студию.

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 22.02.2008 (Пт) 9:10

Неет, не буду - стесняюсь :oops:
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 22.02.2008 (Пт) 9:59

Matew писал(а):Неет, не буду - стесняюсь :oops:

:D Сначало выложил потом удалил, я все равно успел скачать...
Немного переделал:
Код: Выделить всё
Sub RisovatKonstr(Konstr As Konstrukcia, Frm As Object, tpVydel As Vydel)
Dim hBmpPrev As Long, pbDocHeight As Long, pbDocWidth As Long
Dim ret As Long, pbDochDC As Long, hBmp As Long, hdc As Long
hdc = GetDC(0)
pbDochDC = CreateCompatibleDC(hdc)
pbDocHeight = 2000
pbDocWidth = 2000
hBmp = CreateCompatibleBitmap(hdc, pbDocWidth, pbDocHeight)
DeleteObject SelectObject(pbDochDC, hBmp)
SetBkMode pbDochDC, TRANSPARENT
Ster pbDochDC, pbDocWidth, pbDocHeight ' pbDochDC закрашивается цветом фона
Narisovat Konstr, pbDochDC, tpVydel ' на pbDochDC рисуется рисунок
StretchBlt Frm.hdc, 0, 0, Frm.ScaleWidth, Frm.ScaleHeight, pbDochDC, 0, 0, pbDocWidth, pbDocHeight, vbSrcCopy
ret = DeleteDC(pbDochDC)
DeleteObject hBmp
ReleaseDC 0, hdc
End Sub

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 22.02.2008 (Пт) 10:16

HiSER, надеюсь, не очень позорно написано? :)
За доработку спасибо. Пока не смог уронить. :)
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 22.02.2008 (Пт) 10:35

Matew писал(а):HiSER, надеюсь, не очень позорно написано? :)

Нету понятия позорно, не позорно...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 14.03.2008 (Пт) 4:02

Та же процедура чуть-чуть модифицирована:
Код: Выделить всё
Sub RisovatKonstr(Konstr As Konstrukcia, Frm As Object, tpVydel As Vydel)
Dim hBmpPrev As Long
Static pbDocHeight As Long, pbDocWidth As Long
If pbDocHeight = 0 Then
    pbDocHeight = 2500
    pbDocWidth = 2500
End If
pbDocHeight = pbDocHeight + 1
pbDocWidth = pbDocHeight
Dim ret As Long, pbDochDC As Long, hBmp As Long, hdc As Long
hdc = GetDC(0)
pbDochDC = CreateCompatibleDC(hdc)
hBmp = CreateCompatibleBitmap(hdc, pbDocWidth, pbDocHeight)
If hBmp = 0 Then
    MsgBox "Слишком большие габариты!"
    End
End If
hBmpPrev = SelectObject(pbDochDC, hBmp)
SetBkMode pbDochDC, TRANSPARENT
Ster pbDochDC, pbDocWidth, pbDocHeight
Narisovat Konstr, pbDochDC, tpVydel 'рисует на pbDochDC
StretchBlt Frm.hdc, 0, 0, Frm.ScaleWidth, Frm.ScaleHeight, pbDochDC, 0, 0, pbDocWidth, pbDocHeight, vbSrcCopy
ret = DeleteDC(pbDochDC)
DeleteObject hBmp
ReleaseDC 0, hdc

Так вот Bitmap перестает создаваться при pbDocWidth* pbDocHeight=~7450000 кв. пикселей.
Чем обусловлено это ограничение и как его можно обойти?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 16.03.2008 (Вс) 11:00

Вот нашел похожий случай:
http://www.dore.ru/perl/nntp.pl?f=1&gid=24&mid=34962
Ответа нет. Подскажите, что делать. Если нельзя обойти ограничения, то как проще всего поменять логику? Может вместо битмапа использовать какой-нибудь контрол с огромными размерами?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 29

    TopList