xiaoy 发表于 2011-5-4 09:45:37

【已解决】内置资源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

netegg 发表于 2011-5-4 10:01:31

While 1
_ResourceSetImageToCtrl($pic1, "TEST_jpg_" & Random(1, 2, 1))
WEnd
你这个无限循环,内存不增大才奇怪呢

3mile 发表于 2011-5-4 10:15:54

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),不是已经释放全局内存对象了吗?

hzxymkb 发表于 2011-5-4 10:16:27

LS正解!While部分是循环呀!

xiaoy 发表于 2011-5-4 10:16:53

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

xiaoy 发表于 2011-5-4 10:23:52

注意这句:_MemGlobalFree($hData),不是已经释放全局内存对象了吗?
3mile 发表于 2011-5-4 10:15 http://www.autoitx.com/images/common/back.gif

如果真释放了,内存就不会变大,我所以想不通,关键根本不是循不循环的问题,大不了,CPU使用很大,但内存在巨增,这就有问题了!!如果使用GUICtrlSetImage更新,内存完全没有变化!!!

xiaoy 发表于 2011-5-4 10:26:53

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循环更新,内存完全没有变化!!!

xiaoy 发表于 2011-5-4 10:49:34

_ResourceSetImageToCtrl吃内存,是我在做一个滚动广告界面时,无意中发现的!界面需要不停的滚动播出广告图片,图片使用resources内置,当发现运行不久,系统就越来越慢,最后像卡住了一样,终止程序,又恢复了,经过对代码逐条清理,发现了_ResourceSetImageToCtrl这个罪魁祸首!!如果把图片释放到硬盘,使用GUICtrlSetImage循环更新,内存根本没变化!!

netegg 发表于 2011-5-4 10:55:13

确实没试,不过试了之后你那个就更不对呀,加了while,我这也不增大呀

xiaoy 发表于 2011-5-4 10:59:06

本帖最后由 xiaoy 于 2011-5-4 11:00 编辑

确实没试,不过试了之后你那个就更不对呀,加了while,我这也不增大呀
netegg 发表于 2011-5-4 10:55 http://www.autoitx.com/images/common/back.gif

内置图片了吗??要打包之后再试!!请给你试验的代码,我试一试!

包谷面 发表于 2011-5-4 11:19:25

来看   大大们   高谈阔论{:face (411):}

3mile 发表于 2011-5-4 11:21:53

没测试过,只是猜想,是否位图对象资源没有释放呢?
在_WinAPI_DeleteObject($pStream)
_MemGlobalFree($hData)这两行之间增加如下行试试
_WinAPI_DeleteObject($hBitmap)

xiaoy 发表于 2011-5-4 11:51:39

本帖最后由 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还是有很多小毛病,需要大家来完善!

netegg 发表于 2011-5-4 13:29:14

回复 10# xiaoy
编译吗?

xiaoy 发表于 2011-5-4 15:08:07

回复 14# netegg

是的,3mile已经解决
页: [1]
查看完整版本: 【已解决】内置资源UDF-resources又发现小BUG