powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как отследить утечку памяти / загрузку CPU
9 сообщений из 9, страница 1 из 1
Как отследить утечку памяти / загрузку CPU
    #38036433
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу новую прогу.
C-шная часть (Opal.dll) управляется из VB6 через API по принципу
SendMessage -> GetMessage -> (действия)-> FreeMessage
либо
OnGetMessage->(действия)-> FreeMessage

Есть еще куча всяких "красот" в плане API-GDI в VB6 части приложения.

Программа далеко еще не написана, но стал замечать следующее:
Если оставить прогу загруженной на несколько часов, то начинаются "визуально видимые" тормоза.
Т.е. нажимаешь например кнопку изменить настройки - графика тормозит страшно.
Смотришь загрузку CPU -может быть 50% и больше.

Пробовал отключать родной дебаг Opal (пишет много всего в текстовуху) - не помогает.

Есть еще временный прибамбас:
Код: vbnet
1.
2.
3.
If MyDebug then
  form1.text=form1.text + vbcrlf + MydebugStr
endif


(вывожу свой debug в тектовое поле, эта штука кстати переполняется и перестает делать вывод всего текста видимо когда длина текста превышает допустимую)
Сейчас отключил, посмотрю что будет, может оно?

Ну, графические объекты типа lngIcon вроде уничтожаю в процессе работы. (один раз с таким багом столкнулся, типа по таймеру заново генерируется иконка в память и отображается - без уничтожения - был эффект как сейчас).

Т.е. как вообще отследить "утечку".
Если виноват Opal (фиговую версию оприходовал), то я конечно вряд ли что смогу сделать.
А если что-то в моем коде?

Как вообще найти/искать слабое звено?
...
Рейтинг: 0 / 0
Как отследить утечку памяти / загрузку CPU
    #38036448
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, сделать максимально облегченный вариант своей проги — только алгоритм работы с этой библиотекой. Можно даже (действия) убрать. Если утечки останутся — виноват либо сам опал либо алгоритм работы с ним.

Но почти наверняка утечка в красотах.
...
Рейтинг: 0 / 0
Как отследить утечку памяти / загрузку CPU
    #38038456
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, сегодня на ночь оставлял, утром ничего не тормозило. Но какое-то "ощущение" все же есть.

AntonariyНо почти наверняка утечка в красотах.
Понять бы где. Графика?
"Прозрачность"? Так
Код: vbnet
1.
hbshBackDigits = CreatePatternBrush(hbmpBackDigits)


-всего один,и создается единственный раз в Form_Load, уничтожается один раз в конце.
С иконками тоже вроде все в порядке.
Любое рисование на hdc врядли приведет к утечкам.

Интересно, а при сабклассинге+customdraw
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
            Case CDDS_ITEMPREPAINT
...
                    lvcd.clrText = vbBlue 'синий
                    MoveMemory ByVal lParam, lvcd, Len(lvcd)
                    Exit Function
                Case Else
              End Select 'lvcd.nmcd.hdr.hwndFrom
            Case Else



Exit Function делать надо?
Цвет строчки меняется по любому.

AntonariyЕсли утечки останутся — виноват либо сам опал.
Телефония при этом не тормозит, тормозит вывод формы настроек, в форме настроек прибамбасов много но она выгружается при закрытии (т.е. не загружена основное время).

Да ну, думаю надо забить и писать дальше, глядишь вылезет в процессе.

Что интересно, случайные глюки возникают на XP, на кот. прога пишется и компилируется, а никак не на Висте или 7-ке. Причем ряд глюков явно связан с Opal (не тот кот. описал). Не пора уже от поддержки XP отказываться? Восьмерка какая-то уже вроде вышла.
...
Рейтинг: 0 / 0
Как отследить утечку памяти / загрузку CPU
    #38038514
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Понять бы где.Механизм понимания стандартный: последовательное отключение свистелок и перделок до исчезновения течи.

Дмитрий77Не пора уже от поддержки XP отказываться?Не пора ли уже от VB6 отказываться? Фреймворк и красоты без пинков по почкам обеспечивает равно в XP и 7, и не течет при этом.
...
Рейтинг: 0 / 0
Как отследить утечку памяти / загрузку CPU
    #38040467
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

от этих рассуждений задача не решится.

Подозрение пало на "прозрачность" -почти уже уверен -по истечении времени тормозит именно перерисровка картинки фона (ну если топики мои читали),

По сути я использую 2 кода:
1.где приемлимо WM_CTLCOLOR(XXX)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
'для событий PictureDigits
Public Function NewDigitsWindowProc _
  (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  Select Case Msg
    Case WM_CTLCOLORBTN:
...
    Case WM_CTLCOLORSTATIC:
...
    Case WM_CTLCOLOREDIT:
      If app_UseBkPicture Then
        SetBkMode wParam, TRANSPARENT
        GetWindowRect lParam, rc
        tPt.x = rc.Left
        tPt.y = rc.Top
        MapWindowPoints 0, GetParent(lParam), tPt, 2
        rc.Left = tPt.x
        rc.Top = tPt.y
        SetBrushOrgEx wParam, -rc.Left, -rc.Top, tPt
        NewDigitsWindowProc = hbshBackDigits
        SetTextColor wParam, FormMain.ComboDial.ForeColor
        Exit Function
      End If



2. Для ListView свой с PatBlt:
Привожу полностью
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Public Function NewListRegisterWindowProc _
  (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  If app_UseBkPicture Then
    Dim rc As RECT
    Dim tPt As POINTAPI
    Dim the_hdc As Long
    Dim hbmDstOld As Long
      
    Select Case Msg
      Case WM_ERASEBKGND:
        the_hdc = GetDC(FormMain.ListRegister.hwnd)
        hbmDstOld = SelectObject(the_hdc, hbshBackDigits)
        SetBkMode the_hdc, TRANSPARENT
        GetWindowRect FormMain.ListRegister.hwnd, rc
        tPt.x = rc.Left
        tPt.y = rc.Top
        MapWindowPoints 0, FormMain.PictureDigits.hwnd, tPt, 2
        rc.Left = tPt.x
        rc.Top = tPt.y
        SetBrushOrgEx the_hdc, -rc.Left, -rc.Top, tPt
        PatBlt the_hdc, 0, 0, FormMain.ListRegister.Width, FormMain.ListRegister.Height, PATCOPY
        SelectObject the_hdc, hbmDstOld
        Call RedrawWindow(FormMain.ListRegister.hwnd, ByVal 0&, ByVal 0&, RDW_INVALIDATE Or RDW_FRAME Or RDW_UPDATENOW)
    
        NewListRegisterWindowProc = 1
        Exit Function
    End Select 'Msg
  End If
  NewListRegisterWindowProc = CallWindowProc _
   (OldListRegisterWindowProc, hwnd, Msg, wParam, lParam)
End Function



Ничего явно дурного во втором коде нет? В первом коде как бы более уверен.
Понятно, что перерисовка жрет какие-то ресурсы, но "хужее" то с течением времени быть не должно.

hbshBackDigits -это brush фоновой картинки, создается один раз при запуске формы (в Load).

Сейчас пока сделал app_UseBkPicture = false (без фоновой картинки) -ни один из кодов не работает -вроде не тормозит.
Но это надо ждать долго и раз на раз не приходится.
Если более менее буду уверен, то попробую отключить только ListView.

Еще например не может быть, что ресурсы гробастаются "совершенно в другом месте", а на перерисовку как на "довольно жрущую операцию" их просто перестает хватать?

Если прогу закрыть и запустить заново, то первое время все всегда хорошо, комп сам от этого не дохнет.

От фоновой картинки главного окна (хотя б как от опции) отказываться не хочу, т.к. скины рисовать - не художник, а картинка (кот. user может задавать свою) и прозрачность делают вид сильно привлекательней (не я понимаю что это "перделки" и "свистелки", а что делать, на перделки и формы с настройками параметров мое основное время и уходит, а телефонию светлые умы за меня уже написали - Opal именно для этого, хотя и там под себя все допиливать надо, но допиливать не строить с нуля).

Antonariy, причем тут Net? Чтобы делать то же самое в net понадобятся те же API.
...
Рейтинг: 0 / 0
Как отследить утечку памяти / загрузку CPU
    #38040471
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. Здесь есть утечка. При использовании GetDC после окончания действий нужно использовать ReleaseDC.
Дмитрий77Antonariy, причем тут Net? Чтобы делать то же самое в net понадобятся те же API.Я почти уверен, тоже самое в Net делается на объектном уровне.
...
Рейтинг: 0 / 0
Как отследить утечку памяти / загрузку CPU
    #38040767
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy2. Здесь есть утечка. При использовании GetDC после окончания действий нужно использовать ReleaseDC.
Ну, думаю ты прав. Спасибо. А сильная утечка, как считаешь? Листвью как бы "маленький", но те несколько строк что он содержит, обновляются в среднем раз в минуту (если даже окно не дергать).
Сделал так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    Select Case Msg
      Case WM_ERASEBKGND:
        the_hdc = GetDC(FormMain.ListRegister.hwnd)
        hbmDstOld = SelectObject(the_hdc, hbshBackDigits)
        SetBkMode the_hdc, TRANSPARENT
        GetWindowRect FormMain.ListRegister.hwnd, rc
        tPt.x = rc.Left
        tPt.y = rc.Top
        MapWindowPoints 0, FormMain.PictureDigits.hwnd, tPt, 2
        rc.Left = tPt.x
        rc.Top = tPt.y
        SetBrushOrgEx the_hdc, -rc.Left, -rc.Top, tPt
        PatBlt the_hdc, 0, 0, FormMain.ListRegister.Width, FormMain.ListRegister.Height, PATCOPY
        SelectObject the_hdc, hbmDstOld
        ReleaseDC FormMain.ListRegister.hwnd, the_hdc
        Call RedrawWindow(FormMain.ListRegister.hwnd, ByVal 0&, ByVal 0&, RDW_INVALIDATE Or RDW_FRAME Or RDW_UPDATENOW)
    
        NewListRegisterWindowProc = 1
        Exit Function
    End Select 'Msg


Посмотрю получился ли эффект.
Первый код я аккуратно передрал когда-то с C++ (насилу нашел).
А второй код сделан самостоятельно из первого глядя на еще чего-то, вот видимо на радостях что получилось и упустил про ReleaseDC.

Дмитрий77Я почти уверен, тоже самое в Net делается на объектном уровне.
Я ж сам понимаешь и на нетовские коды натыкаюсь пока чего-нибудь ищу.
Как object.property=What_I_need
эти вещи там точно не делаются.
Какие-нибудь заумные события (по сути тот же WinProc)-с кодом пародирующим те же API это да, м.б. и можно.
Преимущество в чем? Что Release-Delete-Kill делаются автоматически на уровне обертки и что ставишь точку, а оно тебе варианты свойств, ф-ций и т.п. автовыдает?

Но по поводу перехода. Я ж хотел. Но чего-то передумал пока. Меня интересует Opal, я практически параллельно разобрался с Net-оберткой (чужой, но допиливал) и тут же сделал "обертку" на VB6 (3 года назад не получилось, а сейчас видимо дорос).
Последний факт как бы добил выбор в пользу пока что VB6.
Хочется написать прогу побыстрее, и я знаю что смогу, а с Net разбираться-ковыряться. С каждой "перделкой" с нуля и еще с ним целиком в целом (+ язык учить если C# а не vb.net). На VB6 то с "перделками" рука набита пусть и через API.
...
Рейтинг: 0 / 0
Как отследить утечку памяти / загрузку CPU
    #38040774
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 А сильная утечка, как считаешь?Ну, это опять же тебе мерить.
Могу лишь сказать, что открытые и не закрытые дескрипторы являются обычной причиной утечек. Еще есть такая функция, может найдутся места, где имеет смысл ее воткнуть.
...
Рейтинг: 0 / 0
Как отследить утечку памяти / загрузку CPU
    #38041684
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЕще есть такая функция, может найдутся места, где имеет смысл ее воткнуть.
В моих старых кодах такие штуки могут местами отсутствовать.
А сейчас я в общем и целом за этим слежу.
Но как выяснилось не без ляпов.

Короче твой совет помог, тесты показали что глюк исчез. Thanks.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как отследить утечку памяти / загрузку CPU
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]