【已解决】内置资源UDF-resources又发现小BUG
本帖最后由 xiaoy 于 2011-5-4 11:52 编辑再次_ResourceSetImageToCtrl图片,原空间未释放,清理内存也不管用,内存不断变大,后果不堪设想!!!研究了源码,未发现原因,请达人看看究竟是什么原因造成的!
以下代码可以一试(一定要将图片打包再试):#AutoIt3Wrapper_Res_File_Add=tu\001.jpg, rt_rcdata, TEST_JPG_1
#AutoIt3Wrapper_Res_File_Add=tu\002.jpg, rt_rcdata, TEST_JPG_2
#include <resources.au3>
#include <WindowsConstants.au3>
$win1 = GUICreate("", 220, 180, (@DesktopWidth - 220) / 2 , (@DesktopHeight - 180) / 2, BitOR($WS_POPUP, $WS_VISIBLE), $WS_EX_TOOLWINDOW)
$pic1 = GUICtrlCreatePic("", 0, 0, 220, 180)
_ResourceSetImageToCtrl($pic1, "TEST_jpg_" & Random(1, 2, 1))
While 1
_ResourceSetImageToCtrl($pic1, "TEST_jpg_" & Random(1, 2, 1))
WEnd While 1
_ResourceSetImageToCtrl($pic1, "TEST_jpg_" & Random(1, 2, 1))
WEnd
你这个无限循环,内存不增大才奇怪呢 Func _ResourceSetImageToCtrl($CtrlId, $ResName, $ResType = 10, $DLL = -1) ; $RT_RCDATA = 10
Local $ResData, $nSize, $hData, $pData, $pStream, $pBitmap, $hBitmap
$ResData = _ResourceGet($ResName, $ResType, 0, $DLL)
If @error Then Return SetError(1, 0, 0)
$nSize = @extended
If $ResType = $RT_BITMAP Then
_SetBitmapToCtrl($CtrlId, $ResData)
If @error Then Return SetError(2, 0, 0)
Else
; thanks ProgAndy
; for other types than BITMAP use GDI+ for converting to bitmap first
$hData = _MemGlobalAlloc($nSize,2)
$pData = _MemGlobalLock($hData)
_MemMoveMemory($ResData,$pData,$nSize)
_MemGlobalUnlock($hData)
$pStream = DllCall( "ole32.dll","int","CreateStreamOnHGlobal", "int",$hData, "long",1, "Int*",0)
$pStream = $pStream
$pBitmap = DllCall($ghGDIPDll,"int","GdipCreateBitmapFromStream", "ptr",$pStream, "int*",0)
$pBitmap = $pBitmap
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)
_SetBitmapToCtrl($CtrlId, $hBitmap)
If @error Then SetError(3, 0, 0)
_GDIPlus_BitmapDispose($pBitmap)
_WinAPI_DeleteObject($pStream)
_MemGlobalFree($hData)
EndIf
Return 1
EndFunc
注意这句:_MemGlobalFree($hData),不是已经释放全局内存对象了吗? LS正解!While部分是循环呀! netegg 兄您真的没试验一下,就下了结论,如果不用_ResourceSetImageToCtrl而用GUICtrlSetImage内存将一点变化也没有!!不信可试:#include <WindowsConstants.au3>
$win1 = GUICreate("Little Fei card slot machine", 220, 180, (@DesktopWidth - 220) / 2 , (@DesktopHeight - 180) / 2, BitOR($WS_POPUP, $WS_VISIBLE), $WS_EX_TOOLWINDOW)
$pic1 = GUICtrlCreatePic("", 0, 0, 220, 180)
GUICtrlSetImage ( $pic1, "tu\001.jpg")
While 1
GUICtrlSetImage ( $pic1, "tu\00"&Random(1, 2, 1)&".jpg")
WEnd 注意这句:_MemGlobalFree($hData),不是已经释放全局内存对象了吗?
3mile 发表于 2011-5-4 10:15 http://www.autoitx.com/images/common/back.gif
如果真释放了,内存就不会变大,我所以想不通,关键根本不是循不循环的问题,大不了,CPU使用很大,但内存在巨增,这就有问题了!!如果使用GUICtrlSetImage更新,内存完全没有变化!!! While 1
_ResourceSetImageToCtrl($pic1, "TEST_jpg_" & Random(1, 2, 1))
WEnd
你这个无限循环,内存不 ...
netegg 发表于 2011-5-4 10:01 http://www.autoitx.com/images/common/back.gif
使用GUICtrlSetImage循环更新,内存完全没有变化!!! _ResourceSetImageToCtrl吃内存,是我在做一个滚动广告界面时,无意中发现的!界面需要不停的滚动播出广告图片,图片使用resources内置,当发现运行不久,系统就越来越慢,最后像卡住了一样,终止程序,又恢复了,经过对代码逐条清理,发现了_ResourceSetImageToCtrl这个罪魁祸首!!如果把图片释放到硬盘,使用GUICtrlSetImage循环更新,内存根本没变化!! 确实没试,不过试了之后你那个就更不对呀,加了while,我这也不增大呀 本帖最后由 xiaoy 于 2011-5-4 11:00 编辑
确实没试,不过试了之后你那个就更不对呀,加了while,我这也不增大呀
netegg 发表于 2011-5-4 10:55 http://www.autoitx.com/images/common/back.gif
内置图片了吗??要打包之后再试!!请给你试验的代码,我试一试! 来看 大大们 高谈阔论{:face (411):} 没测试过,只是猜想,是否位图对象资源没有释放呢?
在_WinAPI_DeleteObject($pStream)
_MemGlobalFree($hData)这两行之间增加如下行试试
_WinAPI_DeleteObject($hBitmap) 本帖最后由 xiaoy 于 2011-5-4 11:57 编辑
没测试过,只是猜想,是否位图对象资源没有释放呢?
在_WinAPI_DeleteObject($pStream)
_MemGlobalFree($hDa ...
3mile 发表于 2011-5-4 11:21 http://www.autoitx.com/images/common/back.gif
完全正确,哈哈,谢谢!不过感觉resources还是有很多小毛病,需要大家来完善! 回复 10# xiaoy
编译吗? 回复 14# netegg
是的,3mile已经解决
页:
[1]