五猫橙 发表于 2009-10-9 16:13:51

今天弄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占用率也稍高了...
代码很烂..各位将就看..灰常感谢了...

superflq 发表于 2009-10-9 16:17:07

可以用事件模式 ,资料论坛搜索

KiwiCsj 发表于 2009-10-9 16:55:28

习惯事件模式。

五猫橙 发表于 2009-10-9 17:05:46

看了半天帮助...没明白...有相关的实例吗?

KiwiCsj 发表于 2009-10-9 17:10:55

看的是哪方面的帮助?你想理解的是消息模式还是事件模式?
如果是事件模式,也许我能略微帮到你。消息模式几乎不用,理解不深,没什么可说的体会。

五猫橙 发表于 2009-10-9 17:19:07

稍微理解了onevent..
不过对于这个帖子上面的 每过一段时间 刷新进度条&label 应该怎么实现呢

非常感谢楼上两位

kn007 发表于 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

kn007 发表于 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(进度条)的改变呢..

pusofalse 发表于 2009-10-9 18:24:12

Re 8#:
那样做不知要消耗多少资源,消息循环模式和事件模式,一个主动,一个被动,哪个消耗资源多一些,简直显而易见。
While 1
      If (@MIN & @SEC)-$timer >= 5 Then ...
WEnd
如果程序的执行效率是1秒钟循环10000次,那么这10000次判断中,显然有9999次是多余的,这还只是用If 来判断,如果不加任何判断就直接调用了某函数,OMG。。。

afan 发表于 2009-10-9 18:32:02

我把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

五猫橙 发表于 2009-10-9 20:16:03

RE 11#
那么..如何避免那9999次呢..
OnEvent确实更加省资源,但是...在这个实例中如何应用呢...

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

我的想法是每500ms执行一次func fresh() 而中间最好不要有什么判断啊什么浪费资源的...继续期待解答...

afan 发表于 2009-10-9 21:10:51

Re 13#
不知你的执行效率是如何判断的?
“每500ms执行一次func fresh() ” 不就是 kn007 所说的 AdlibRegister("fresh",500) ?

五猫橙 发表于 2009-10-9 21:25:20

就是这样...我也刚刚在帮助里面看到这个...这下就明白了哈...
页: [1] 2
查看完整版本: 今天弄GUI发现一些很奇怪的问题.关于程序的执行效率