找回密码
 加入
搜索
查看: 6169|回复: 14

[系统综合] 【已解决】内置资源UDF-resources又发现小BUG

  [复制链接]
发表于 2011-5-4 09:45:37 | 显示全部楼层 |阅读模式
本帖最后由 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
发表于 2011-5-4 10:01:31 | 显示全部楼层
While 1
_ResourceSetImageToCtrl($pic1, "TEST_jpg_" & Random(1, 2, 1))
WEnd
你这个无限循环,内存不增大才奇怪呢
发表于 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[3]
                $pBitmap = DllCall($ghGDIPDll,"int","GdipCreateBitmapFromStream", "ptr",$pStream, "int*",0)
                $pBitmap = $pBitmap[2]
                $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),不是已经释放全局内存对象了吗?
发表于 2011-5-4 10:16:27 | 显示全部楼层
LS正解!While部分是循环呀!
 楼主| 发表于 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
 楼主| 发表于 2011-5-4 10:23:52 | 显示全部楼层
注意这句:_MemGlobalFree($hData),不是已经释放全局内存对象了吗?
3mile 发表于 2011-5-4 10:15


如果真释放了,内存就不会变大,我所以想不通,关键根本不是循不循环的问题,大不了,CPU使用很大,但内存在巨增,这就有问题了!!如果使用GUICtrlSetImage更新,内存完全没有变化!!!
 楼主| 发表于 2011-5-4 10:26:53 | 显示全部楼层
While 1
_ResourceSetImageToCtrl($pic1, "TEST_jpg_" & Random(1, 2, 1))
WEnd
你这个无限循环,内存不 ...
netegg 发表于 2011-5-4 10:01


使用GUICtrlSetImage循环更新,内存完全没有变化!!!
 楼主| 发表于 2011-5-4 10:49:34 | 显示全部楼层
_ResourceSetImageToCtrl吃内存,是我在做一个滚动广告界面时,无意中发现的!界面需要不停的滚动播出广告图片,图片使用resources内置,当发现运行不久,系统就越来越慢,最后像卡住了一样,终止程序,又恢复了,经过对代码逐条清理,发现了_ResourceSetImageToCtrl这个罪魁祸首!!如果把图片释放到硬盘,使用GUICtrlSetImage循环更新,内存根本没变化!!
发表于 2011-5-4 10:55:13 | 显示全部楼层
确实没试,不过试了之后你那个就更不对呀,加了while,我这也不增大呀
 楼主| 发表于 2011-5-4 10:59:06 | 显示全部楼层
本帖最后由 xiaoy 于 2011-5-4 11:00 编辑
确实没试,不过试了之后你那个就更不对呀,加了while,我这也不增大呀
netegg 发表于 2011-5-4 10:55


内置图片了吗??要打包之后再试!!请给你试验的代码,我试一试!
发表于 2011-5-4 11:19:25 | 显示全部楼层
来看   大大们   高谈阔论
发表于 2011-5-4 11:21:53 | 显示全部楼层
没测试过,只是猜想,是否位图对象资源没有释放呢?
在_WinAPI_DeleteObject($pStream)
_MemGlobalFree($hData)这两行之间增加如下行试试
_WinAPI_DeleteObject($hBitmap)
 楼主| 发表于 2011-5-4 11:51:39 | 显示全部楼层
本帖最后由 xiaoy 于 2011-5-4 11:57 编辑
没测试过,只是猜想,是否位图对象资源没有释放呢?
在_WinAPI_DeleteObject($pStream)
_MemGlobalFree($hDa ...
3mile 发表于 2011-5-4 11:21


完全正确,哈哈,谢谢!不过感觉resources还是有很多小毛病,需要大家来完善!
发表于 2011-5-4 13:29:14 | 显示全部楼层
回复 10# xiaoy
编译吗?
 楼主| 发表于 2011-5-4 15:08:07 | 显示全部楼层
回复 14# netegg

是的,3mile已经解决
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-10-2 06:34 , Processed in 0.101886 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表