找回密码
 加入
搜索
查看: 5142|回复: 16

今天弄GUI发现一些很奇怪的问题.关于程序的执行效率

[复制链接]
发表于 2009-10-9 16:13:51 | 显示全部楼层 |阅读模式
#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占用率也稍高了...
代码很烂..各位将就看..灰常感谢了...
发表于 2009-10-9 16:17:07 | 显示全部楼层
可以用事件模式 ,资料论坛搜索
发表于 2009-10-9 16:55:28 | 显示全部楼层
习惯事件模式。
 楼主| 发表于 2009-10-9 17:05:46 | 显示全部楼层
看了半天帮助...没明白...有相关的实例吗?
发表于 2009-10-9 17:10:55 | 显示全部楼层
看的是哪方面的帮助?你想理解的是消息模式还是事件模式?
如果是事件模式,也许我能略微帮到你。消息模式几乎不用,理解不深,没什么可说的体会。
 楼主| 发表于 2009-10-9 17:19:07 | 显示全部楼层
稍微理解了onevent..
不过对于这个帖子上面的 每过一段时间 刷新进度条&label 应该怎么实现呢

非常感谢楼上两位
发表于 2009-10-9 17:26:30 | 显示全部楼层
我一般都是这样的
#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
发表于 2009-10-9 17:28:14 | 显示全部楼层
用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
 楼主| 发表于 2009-10-9 17:52:58 | 显示全部楼层
7# kn007


跟我的差不多...另外在帮助文档里面发现了这句:
像上面这种循环周期非常短的脚本通常会把CPU占用推到高达 100%,幸运的是 GUIGetMsg 函数可在无事件等待时自动闲置CPU.另外千万 不要 因为怕增加CPU压力而自己添加休眠语句(Sleep)到脚本中,这么做只会让GUI响应迟钝.

而且我测试了一下...问题依旧...如何把progressbar&label按时刷新而又保证执行效率是俺想的问题...

不过8L的代码很有意思...我再看看
 楼主| 发表于 2009-10-9 18:02:07 | 显示全部楼层
我把onEvent理解为.如果点击了某个按钮.或者GUI有了某种活动,才开始某个func
不过这种因为某个变量(下载百分比)的改变如何能够触发GUI(进度条)的改变呢..
发表于 2009-10-9 18:24:12 | 显示全部楼层
Re 8#:
那样做不知要消耗多少资源,消息循环模式和事件模式,一个主动,一个被动,哪个消耗资源多一些,简直显而易见。
While 1
        If (@MIN & @SEC)-$timer >= 5 Then ...
WEnd
如果程序的执行效率是1秒钟循环10000次,那么这10000次判断中,显然有9999次是多余的,这还只是用If 来判断,如果不加任何判断就直接调用了某函数,OMG。。。

评分

参与人数 1金钱 +1 收起 理由
kn007 + 1 呵呵,这是为了AdlibRegister只能一次,我有 ...

查看全部评分

发表于 2009-10-9 18:32:02 | 显示全部楼层
我把onEvent理解为.如果点击了某个按钮.或者GUI有了某种活动,才开始某个func
不过这种因为某个变量(下载百分比)的改变如何能够触发GUI(进度条)的改变呢..
五猫橙 发表于 2009-10-9 18:02


是不是这个意思
#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
 楼主| 发表于 2009-10-9 20:16:03 | 显示全部楼层
RE 11#
那么..如何避免那9999次呢..
OnEvent确实更加省资源,但是...在这个实例中如何应用呢...

afan那个..似乎执行效率还是一般...

我的想法是每500ms执行一次func fresh() 而中间最好不要有什么判断啊什么浪费资源的...继续期待解答...
发表于 2009-10-9 21:10:51 | 显示全部楼层
Re 13#
不知你的执行效率是如何判断的?
“每500ms执行一次func fresh() ” 不就是 kn007 所说的 AdlibRegister("fresh",500) ?
 楼主| 发表于 2009-10-9 21:25:20 | 显示全部楼层
就是这样...我也刚刚在帮助里面看到这个...这下就明白了哈...
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 10:54 , Processed in 0.374797 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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