今天弄GUI发现一些很奇怪的问题.关于程序的执行效率
#include <GUIConstantsEx.au3>#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 333, 145, 733, 411)
$Progress1 = GUICtrlCreateProgress(16, 96, 305, 25)
$Label1 = GUICtrlCreateLabel("百分比", 32, 24, 40, 17)
;~ $Label2 = GUICtrlCreateLabel("剩余时间 ", 152, 24, 61, 17)
;~ $Label3 = GUICtrlCreateLabel("速度 ", 160, 56, 37, 17)
GUISetState(@SW_SHOW)
$DLurl="http://autoit-cn.googlecode.com/files/AUTOIT_3.3.1.1-2.exe"
$remotesize=InetGetSize($DLurl)
InetGet($DLurl,"offline.rar",1,1)
While @InetGetActive
;~ Sleep(1)
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
fresh()
WEnd
Func fresh()
$localsize=@InetGetBytesRead
GUICtrlSetData($Label1,Round($localsize/$remotesize*100,2) & "%")
GUICtrlSetData($Progress1,$localsize/$remotesize*100)
EndFunc
在while那一段里面.如果sleep500.那么百分比的更新就是一秒两次;如果sleep1就是实时更新,但是为什么sleep500的时候GUI里面的按钮(右上角的X)就不起作用呢...CPU占用率也稍高了...
代码很烂..各位将就看..灰常感谢了... 可以用事件模式 ,资料论坛搜索 习惯事件模式。 看了半天帮助...没明白...有相关的实例吗? 看的是哪方面的帮助?你想理解的是消息模式还是事件模式?
如果是事件模式,也许我能略微帮到你。消息模式几乎不用,理解不深,没什么可说的体会。 稍微理解了onevent..
不过对于这个帖子上面的 每过一段时间 刷新进度条&label 应该怎么实现呢
非常感谢楼上两位 我一般都是这样的#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 333, 145, 733, 411)
$Progress1 = GUICtrlCreateProgress(16, 96, 305, 25)
$Label1 = GUICtrlCreateLabel("百分比", 32, 24, 40, 17)
;~ $Label2 = GUICtrlCreateLabel("剩余时间 ", 152, 24, 61, 17)
;~ $Label3 = GUICtrlCreateLabel("速度 ", 160, 56, 37, 17)
GUISetState(@SW_SHOW)
$DLurl="http://autoit-cn.googlecode.com/files/AUTOIT_3.3.1.1-2.exe"
$remotesize=InetGetSize($DLurl)
InetGet($DLurl,"offline.rar",1,1)
While @InetGetActive
Sleep(1)
IF GUIGetMsg() = -3 Then Exit 0
fresh()
WEnd
Func fresh()
$localsize=@InetGetBytesRead
GUICtrlSetData($Label1,Round($localsize/$remotesize*100,2) & "%")
GUICtrlSetData($Progress1,$localsize/$remotesize*100)
EndFunc 用oneven的话,请在GUISetState(@SW_SHOW)后面加上AdlibEnable("fresh",500)
如果你是3311版本,那么就是AdlibRegister("fresh",500)
我最不喜欢Adlib和事件模式
我喜欢用time来执行多任务
Dim $timer = @MIN & @SEC
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
If (@MIN & @SEC)-$timer >= 5 Then
$timer = @MIN & @SEC
;所要执行的,比如fresh()
EndIf
WEnd 7# kn007
跟我的差不多...另外在帮助文档里面发现了这句:
像上面这种循环周期非常短的脚本通常会把CPU占用推到高达 100%,幸运的是 GUIGetMsg 函数可在无事件等待时自动闲置CPU.另外千万 不要 因为怕增加CPU压力而自己添加休眠语句(Sleep)到脚本中,这么做只会让GUI响应迟钝.
而且我测试了一下...问题依旧...如何把progressbar&label按时刷新而又保证执行效率是俺想的问题...
不过8L的代码很有意思...我再看看 我把onEvent理解为.如果点击了某个按钮.或者GUI有了某种活动,才开始某个func
不过这种因为某个变量(下载百分比)的改变如何能够触发GUI(进度条)的改变呢.. Re 8#:
那样做不知要消耗多少资源,消息循环模式和事件模式,一个主动,一个被动,哪个消耗资源多一些,简直显而易见。
While 1
If (@MIN & @SEC)-$timer >= 5 Then ...
WEnd
如果程序的执行效率是1秒钟循环10000次,那么这10000次判断中,显然有9999次是多余的,这还只是用If 来判断,如果不加任何判断就直接调用了某函数,OMG。。。 我把onEvent理解为.如果点击了某个按钮.或者GUI有了某种活动,才开始某个func
不过这种因为某个变量(下载百分比)的改变如何能够触发GUI(进度条)的改变呢..
五猫橙 发表于 2009-10-9 18:02 http://www.autoitx.com/images/common/back.gif
是不是这个意思#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 333, 145, 733, 411)
$Progress1 = GUICtrlCreateProgress(16, 96, 305, 25)
$Label1 = GUICtrlCreateLabel("百分比", 32, 24, 40, 17)
;~ $Label2 = GUICtrlCreateLabel("剩余时间 ", 152, 24, 61, 17)
;~ $Label3 = GUICtrlCreateLabel("速度 ", 160, 56, 37, 17)
GUISetState(@SW_SHOW)
$DLurl = "http://autoit-cn.googlecode.com/files/AUTOIT_3.3.1.1-2.exe"
$remotesize = InetGetSize($DLurl)
InetGet($DLurl, "offline.rar", 1, 1)
$localsize = @InetGetBytesRead
While @InetGetActive
If @InetGetBytesRead <> $localsize Then
GUICtrlSetData($Label1, Round($localsize / $remotesize * 100, 2) & "%")
GUICtrlSetData($Progress1, $localsize / $remotesize * 100)
$localsize = @InetGetBytesRead
EndIf
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd RE 11#
那么..如何避免那9999次呢..
OnEvent确实更加省资源,但是...在这个实例中如何应用呢...
afan那个..似乎执行效率还是一般...
我的想法是每500ms执行一次func fresh() 而中间最好不要有什么判断啊什么浪费资源的...继续期待解答... Re 13#
不知你的执行效率是如何判断的?
“每500ms执行一次func fresh() ” 不就是 kn007 所说的 AdlibRegister("fresh",500) ? 就是这样...我也刚刚在帮助里面看到这个...这下就明白了哈...
页:
[1]
2