Нужен Bounds Checker

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Нужен Bounds Checker

Сообщение Jupiter » 01.11.2006 (Ср) 16:58

Здравствуйте. У меня в программе на VB6 используется рисование через WinAPI GUI и кое-где есть утечки ресурсов. Я это обнаруживаю по глюкам, начинающимся через неск. минут после старта программы. Подскажите, какой Bounds Checker мне нужен и где его стащить? Интеграция в среду VB мне не требуется, надо, чтобы хотя бы намек был, что за утечки где примерно их искать.
Спсибо

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.11.2006 (Ср) 17:45

Mozg.dll нужен. С возможностью чтения MSDN (интеграция не требуется, надо, чтобы хотя бы намёк был...)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 01.11.2006 (Ср) 18:04

GSerg писал(а):Mozg.dll нужен.
Тарабарщина какая-то...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 01.11.2006 (Ср) 18:09

надеюсь, что у тебя в коде есть такие строчки:

Код: Выделить всё
    ...
    DeleteDC mDC
    DeleteObject mBitmap


:)

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 01.11.2006 (Ср) 18:31

Konst_One писал(а):надеюсь, что у тебя в коде есть такие строчки:

Код: Выделить всё
    ...
    DeleteDC mDC
    DeleteObject mBitmap


:)

Да, и есть еще кое что: :)
Код: Выделить всё
Public Sub DisplayVideoCaption(ByVal hWnd As Long, ByVal hdc As Long, ByVal WinWidth As Long, _
                sCaption As String, ByVal IsRecording As Boolean)
    Dim hSaveDC As Long
    Dim siz As Size
    Dim X0 As Long, Y0 As Long
    Dim lSize As Long
    Dim hFont As Long
    Dim RecColor As Long
    Dim hBrush As Long
    Dim hPen As Long

    hSaveDC = SaveDC(hdc)
    SetBkMode hdc, TRANSPARENT
    SetTextAlign hdc, (TA_LEFT Or TA_TOP Or TA_NOUPDATECP)
    hFont = MyCreateAndSelectFont(hdc, "Arial", 12, False)

    ' Тень
    X0 = 7:  Y0 = 5
    SetTextColor hdc, vbBlack
    TextOut hdc, X0, Y0, sCaption, Len(sCaption)

    ' Сам текст
    X0 = X0 - 1: Y0 = Y0 - 1
    SetTextColor hdc, vbYellow
    TextOut hdc, X0, Y0, sCaption, Len(sCaption)

    ' Кружок записи
    X0 = WinWidth - 20: Y0 = Y0 + 4
    SetBkMode hdc, OPAQUE
    RecColor = IIf(IsRecording, vbRed, vbCyan)
    hPen = CreatePen(0, 1, RecColor)
    SelectObject hdc, hPen
    hBrush = CreateSolidBrush(RecColor)
    SelectObject hdc, hBrush

    Ellipse hdc, X0, Y0, X0 + 7, Y0 + 7

    ' Восстановление
    RestoreDC hdc, hSaveDC
    DeleteObject hFont
    DeleteObject hBrush
    DeleteObject hPen
   ' ReleaseDC hWnd, hdc
End Sub


ReleaseDC hWnd, hdc был добавлен после (по идее не нужен), но он не помогает.
Спасибо.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 01.11.2006 (Ср) 19:37

Утечка памяти - обычная проблема в вб и никак не решается. Можно закрывать все хендлы, освобождать объекты, обнулять переменные, но память все равно будет утекать, только меньше. Утечка была одной из двух причин, по которым я перешел на html-интерфейсы.
Лучший способ понять что-то самому — объяснить это другому.

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 01.11.2006 (Ср) 20:20

Код: Выделить всё
SelectObject hdc, hPen
SelectObject hdc, hBrush 

замени на
Код: Выделить всё
DeleteObject SelectObject( hdc, hPen)
DeleteObject SelectObject (hdc, hBrush)

По идее меньше утекать будет.
Если всё делать своими ручками, они скоро отвалятся !

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 02.11.2006 (Чт) 1:32

Код: Выделить всё
Утечка памяти - обычная проблема в вб и никак не решается.


это бред полный. есть программы активно использующие системные ресурсы и не перезапускаемые по несколько месяцев.
все парамеры полета как доктор прописал !

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.11.2006 (Чт) 8:03

Проблем здесь:
Код: Выделить всё
    ...
    SelectObject hdc, hPen
    hBrush = CreateSolidBrush(RecColor)
    SelectObject hdc, hBrush

    Ellipse hdc, X0, Y0, X0 + 7, Y0 + 7

    ' Восстановление
    RestoreDC hdc, hSaveDC
    DeleteObject hFont
    DeleteObject hBrush
    DeleteObject hPen
   ' ReleaseDC hWnd, hdc
End Sub


ибо не восстанавливаются исходные кисть и перо. Переписывай так:

Код: Выделить всё
    ...
Dim oldPen As Long
Dim oldBrush As Long
    oldPen = SelectObject( hdc, hPen)
    hBrush = CreateSolidBrush(RecColor)
    oldBrush = SelectObject (hdc, hBrush)

    Ellipse hdc, X0, Y0, X0 + 7, Y0 + 7

    ' Восстановление
    SelectObject hdc, oldPen
    SelectObject hdc, oldBrush
    RestoreDC hdc, hSaveDC
    DeleteObject hFont
    DeleteObject hBrush
    DeleteObject hPen
End Sub


З.Ы. Хотя с другой стороны RestoreDC вроде должно и так все восстановить
Весь мир матрица, а мы в нем потоки байтов!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 02.11.2006 (Чт) 10:32

это бред полный. есть программы активно использующие системные ресурсы и не перезапускаемые по несколько месяцев.
все парамеры полета как доктор прописал !
А если ты работаешь с обычной прогой с навороченным интерфейсом постоянно открывая и закрывая формы? Я специально проверял на почти пустом mdi-интерфейсе, и хоть по паре k на несколько открытий/закрытий mdi-child, но память таки отъедало.
Лучший способ понять что-то самому — объяснить это другому.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 02.11.2006 (Чт) 10:43

А если ты работаешь с обычной прогой с навороченным интерфейсом постоянно открывая и закрывая формы?

да, так и работает.

Я специально проверял на почти пустом mdi-интерфейсе, и хоть по паре k на несколько открытий/закрытий mdi-child, но память таки отъедало.


ок. сделай цикл на открытие раз в секунду например. и оставь хотя бы на сутки, думаешь виртуальная память кончится ?

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 02.11.2006 (Чт) 14:52

Проблема утечки решена. Я сам виноват: использовал непроверенный кусок кода. Кому интересно расскажу.
У меня есть вызов MyCreateAndSelectFont. Так вот , эта функция выглядела так:
Код: Выделить всё
Private Function MyCreateAndSelectFont(ByVal hdc As Long, sFontFace As String, ByVal lSize As Long, _
            Optional ByVal bBold As Boolean = False, Optional ByVal bItalic As Boolean = False) As Long
    Dim hFont As Long
   
    lSize = lSize * GetDeviceCaps(GetDC(0), LOGPIXELSY) \ 72 
    hFont = CreateFont(-lSize, 0, 0, 0, IIf(bBold, FW_BOLD, FW_NORMAL), bItalic, False, False, 204, 0, 0, 0, 0, "Arial Narrow")
    SelectObject hdc, hFont
   
    MyCreateAndSelectFont = hFont
End Function

Строки GetDeviceCaps и CreateFont были взяты мной из чужого кода из Инета. Я не стал разбираться, что такое 72, а вместе с тем и что такое GetDC(0). А здесь-то ошибка и есть. Теперь я заменил этот непонятный GetDC(0) на мой hdc и все заработало.
Хотя все равно есть желание запустить какой-нибудь Bounce Checker и проверить, что кисти с перьями не улетают. Может кто знает простую прогу для этого? (хотя, уже не критично)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.11.2006 (Чт) 14:57

У NuMega что-то такое есть.
Но это софт дорогой.
Lasciate ogni speranza, voi ch'entrate.

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 02.11.2006 (Чт) 14:59

Может кто знает простую прогу для этого? (хотя, уже не критично)


то что всегда под рукой - это Диспетчер задач, там и смотри кол-во используемых системных ресурсов, смотри чтобы например при закрытии формы GDI объекты возвращались в состояние до открытия и т.д.

на vbaccelerator.com есть тулза - строит график использования системных ресурсов - очень наглядно получается смотреть на это дело.

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 02.11.2006 (Чт) 15:40

NashRus писал(а):на vbaccelerator.com есть тулза - строит график использования системных ресурсов - очень наглядно получается смотреть на это дело.
Классно, спасибо большое! Сейчас нашел, скачал, запустил. Все так и есть: когда там GetDC(0), ресурсы летят, график все время опускается (точнее, поднимается). Когда нет GetDC(0), то график стоит на месте. Прямо в точку :)


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

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

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

    TopList