Автор Тема: DLL и утечка памяти  (Прочитано 334 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн joker2d [?]

  • Новичок
  • *
  • Сообщений: 161
  • Репутация: 0
    • Награды
DLL и утечка памяти
« Создано: Июнь 13, 2018, 10:30:58 »
Использую DLL на c++ для распознования картинок вызов делаю так

Код: AutoIt [Выделить]
$DLLHandle = DllOpen("img.dll")
                $InitValue = DllCall($DLLHandle, "UINT64:cdecl", "Init")
                Sleep(1000)
                Local $result2 = DllCall($DLLHandle, "PTR:cdecl", "HWNDToPBitmap", "HWND", $hwnd, "int", $count_svetov)
                If IsPtr($result2[0]) Then
                    DllCall($DLLHandle, "PTR:cdecl", "PBitmapToFile", "PTR", $result2[0], "Wstr", $papka_for_screen )
                EndIf  
                DllCall($DLLHandle, "int:cdecl", "DeletePBitmap", "PTR", $result2[0])
                DllCall($DLLHandle, "void:cdecl", "Shutdown", "UINT64:cdecl", $InitValue[0]);
                DllClose($DLLHandle)


в процессе использования идет постоянное увеличение используемой памяти причем не самим скриптом, а чем то что в диспечере задач даже не отображаеться, видимо это dll
по коду я его загружаю и выгружаю, почему же память не освобождается ?
в самом коде длл так же память чиститься
может в autoit коде что то забыл добавить чтобы память освобождать ?

пробовал один раз загрузить длл
Код: AutoIt [Выделить]
$DLLHandle = DllOpen("img.dll")

и потом просто к ней обращаться (то есть без вызова DllClose) ничего не меняется память уменьшается точно так же.

Русское сообщество AutoIt

DLL и утечка памяти
« Отправлен: Июнь 13, 2018, 10:30:58 »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2712
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: DLL и утечка памяти
« Ответ #1, Отправлен: Июнь 13, 2018, 11:45:37 »
проблема, скорее, в самой библиотеке.
возможно и в самом коде. приведен только кусок. может быть где то не закрыты дескрипторы и прочее
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн joker2d [?]

  • Новичок
  • *
  • Сообщений: 161

  • Автор темы
  • Репутация: 0
    • Награды
Re: DLL и утечка памяти
« Ответ #2, Отправлен: Июнь 13, 2018, 15:01:32 »
это весь код, ну еще сам бесконечный цикл и вывод логов в консоль
я специально выделил этот кусок в отдельный скрипт чтобы проверить, отъедает память именно он

что за дескрипторы можно пример, попробую вставить и погонять тесты


вот полный код

Код: AutoIt [Выделить]
$count_svetov=4
$hwnd=HWnd("0x000000000002037E")
$papka_for_screen="C:\screen\test.bmp"

while 1
WinSetState($hwnd, "", @SW_SHOW)
                Sleep(1000)
                WinActivate($hwnd)
                Sleep(1000)



ConsoleWrite("Screen START1" & @CRLF)
$DLLHandle = DllOpen("img.dll")
                $InitValue = DllCall($DLLHandle, "UINT64:cdecl", "Init")
                Sleep(1000)
                Local $result2 = DllCall($DLLHandle, "PTR:cdecl", "HWNDToPBitmap", "HWND", $hwnd, "int", $count_svetov)
                If IsPtr($result2[0]) Then
                    DllCall($DLLHandle, "PTR:cdecl", "PBitmapToFile", "PTR", $result2[0], "Wstr", $papka_for_screen )
                    ConsoleWrite("Screen START2" & @CRLF)
                EndIf
                ;ConsoleWrite("$InitValue[0]="&$InitValue[0]& @CRLF)
                DllCall($DLLHandle, "int:cdecl", "DeletePBitmap", "PTR", $result2[0])
                DllCall($DLLHandle, "void:cdecl", "Shutdown", "UINT64:cdecl", $InitValue[0]);
                ConsoleWrite("Screen END1" & @CRLF)
                DllClose($DLLHandle)

$time = @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN
$mem = MemGetStats()
ConsoleWrite($time&" Физическая память: свободно "&$mem[2] & @CRLF)
Sleep(10000)
wend


Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2712
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: DLL и утечка памяти
« Ответ #3, Отправлен: Июнь 13, 2018, 15:05:33 »
Можно обратиться к разработчику библиотеки.
в коде я не вижу ничего такого, чтобы съедало память. даже больше скажу, открытие библиотеки можно вынести перед циклом, а закрытие делать при выходе
проверить не могу,  нет такой библиотеки
« Последнее редактирование: Июнь 13, 2018, 15:12:56 от joiner »

Русское сообщество AutoIt

Re: DLL и утечка памяти
« Ответ #3 Отправлен: Июнь 13, 2018, 15:05:33 »

Оффлайн joker2d [?]

  • Новичок
  • *
  • Сообщений: 161

  • Автор темы
  • Репутация: 0
    • Награды
Re: DLL и утечка памяти
« Ответ #4, Отправлен: Июнь 14, 2018, 08:45:23 »
Понятно значит проблема не в AutoIt
Наверно буду делать вызов скриншота из внешнего exe c помощью RunAsWait и прописывать хендл окна в тхт  чтобы exe его прочитал

А в AutoIt кроме
_ScreenCapture_CaptureWnd
нельзя ничем сделать скрин ? нужно чтобы скрин был маленького размера с чернобелыми цветами, в _ScreenCapture_CaptureWnd нельзя установить количество цветов

Онлайн Tempo [?]

  • Продвинутый
  • ***
  • Сообщений: 398
  • Репутация: 92
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: DLL и утечка памяти
« Ответ #5, Отправлен: Июнь 14, 2018, 12:16:00 »
joker2d, что вам мешает не сохранять скриншот в файл, а работать с полученным битмапом с помощью GDI+?

Пример
Код: AutoIt [Выделить]
#include <GDIPlus.au3>
#include <ScreenCapture.au3>

Run("notepad.exe")
Local $hWnd = WinWaitActive("[CLASS:Notepad]"), $sFile = @ScriptDir & "\Test.png"
_GDIPlus_Startup()

Local $hHBMP = _ScreenCapture_CaptureWnd("", $hWnd)
Local $hBMP = _GDIPlus_BitmapCreateFromHBITMAP($hHBMP)
_WinAPI_DeleteObject($hHBMP)
Local $iW = _GDIPlus_ImageGetWidth($hBMP), $iH = _GDIPlus_ImageGetHeight($hBMP)

Local $hIA = _GDIPlus_ImageAttributesCreate()
Local $tColorMatrix = _GDIPlus_ColorMatrixCreateGrayScale()
_GDIPlus_ImageAttributesSetColorMatrix($hIA, 0, True, $tColorMatrix)

Local $hResizeBMP = _GDIPlus_BitmapCreateFromScan0($iW / 2, $iH / 2, $GDIP_PXF08INDEXED)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hResizeBMP)
_GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hBMP, 0, 0, $iW, $iH, 0, 0, $iW / 2, $iH / 2, $hIA)
_GDIPlus_ImageSaveToFile($hResizeBMP, $sFile)

_GDIPlus_ImageDispose($hBMP)
_GDIPlus_ImageDispose($hResizeBMP)
_GDIPlus_ImageAttributesDispose($hIA)
_GDIPlus_Shutdown()
WinClose($hWnd)
ShellExecute($sFile)
 

« Последнее редактирование: Июнь 14, 2018, 12:35:19 от Tempo »

Русское сообщество AutoIt

Re: DLL и утечка памяти
« Ответ #5 Отправлен: Июнь 14, 2018, 12:16:00 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
4223 Просмотров
Последний ответ Сентябрь 27, 2010, 15:49:38
от Heler
12 Ответов
6324 Просмотров
Последний ответ Июль 17, 2011, 11:31:12
от Yuriy
4 Ответов
3225 Просмотров
Последний ответ Июнь 13, 2013, 11:21:22
от RomchegChe
3 Ответов
2720 Просмотров
Последний ответ Июнь 13, 2013, 13:19:47
от Afonichev
20 Ответов
5834 Просмотров
Последний ответ Май 12, 2014, 15:05:25
от WSWR
3 Ответов
1309 Просмотров
Последний ответ Декабрь 11, 2014, 07:29:26
от IMStrelcov
2 Ответов
1373 Просмотров
Последний ответ Апрель 17, 2015, 12:14:29
от korvindeson
0 Ответов
692 Просмотров
Последний ответ Июнь 24, 2015, 06:42:18
от Zalman1980
2 Ответов
1051 Просмотров
Последний ответ Декабрь 17, 2015, 10:13:49
от proteus86
2 Ответов
654 Просмотров
Последний ответ Март 13, 2017, 22:26:33
от ololowik