找回密码
 加入
搜索
查看: 12006|回复: 18

[AU3基础] [已解决]请教注册函数AdlibRegister阻止代码继续执行如何解决?

 火.. [复制链接]
发表于 2014-3-23 20:30:27 | 显示全部楼层 |阅读模式
本帖最后由 smooth 于 2014-3-25 11:38 编辑

我弄了一个计时器,目的是想在执行主函数的时候,能让它显示在界面上,让用户了解执行主函数耗用多少时间,但是遇到一个矛盾的问题,就是当主函数_BackupDB()在前,注册函数AdlibRegister('timer')在后,计时器不启动。当注册函数AdlibRegister('timer')在前,_BackupDB()在后,又不执行_BackupDB()函数。困惑。
代码片段:

ElseIf MsgBox(65, '备份确认', '您确定要开始备份吗?', '', $Form1) = 1 Then
    Global $Form_M = GUICreate("", 280, 100, -1, -1, BitOR($DS_MODALFRAME, $WS_POPUPWINDOW), '', '')
    GUICtrlCreateLabel("正在执行备份操作,请稍候...... ", 30, 40, 180, 80)
    GUICtrlCreateAvi($Findfileavi, 0, 220, 30, 32, 32, $ACS_AUTOPLAY)
    Global $time = GUICtrlCreateLabel("00:00:00 ", 24, 12, 240, 40)
    GUICtrlSetFont(-1, 50, 400, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    WinWaitActive($Form_M)
    WinSetOnTop($Form_M, "", 1)
    AdlibRegister('timer')
    _BackupDB()
GUIDelete($Form_M)                                                                                                                                                        


代码片段:

AdlibUnRegister('Timer')
Func timer()
        While 1
                $k = Number(StringLeft(GUICtrlRead($time), 2))
                $i = Number(StringMid(GUICtrlRead($time), 4, 2))
                $j = Number(StringRight(StringTrimRight(GUICtrlRead($time), 1), 2))

                If $j <> 59 Then
                        $j += 1
                Else
                        $j = 0
                        If $i < 59 Then
                                $i += 1
                        Else
                                $i = 0
                                If $k < 23 Then
                                        $k += 1
                                Else
                                        $k = 0
                                EndIf
                        EndIf
                EndIf

                GUICtrlSetData($time, StringFormat("%02d:%02d:%02d\n", $k, $i, $j))
                Sleep(1000)
        WEnd
EndFunc   ;==>Timer
发表于 2014-3-23 20:43:34 | 显示全部楼层
AdlibRegister() 已经是具备循环执行函数的基本功能了,但你却在 Timer() 里面循环,完全背离了 AdlibRegister() 的初衷。
另一方面,如果 _BackupDB() 里面有耗时的循环动作,同样会影响 AdlibRegister() 的调用。
如果有阻断型的动作,如 MsgBox(),那么AdlibRegister 也会同时暂停。那样的话,应该尝试改用 _Timer_SetTimer()
 楼主| 发表于 2014-3-23 21:21:55 | 显示全部楼层
回复 2# afan

你说的我反复看了几遍,云里雾里。我第一次用这个函数,帮助也看了N遍,基本上没能理解啥叫注册一个函数,就这样稀里糊涂的用了。我现在在Timer() 里解除注册,这样AdlibRegister('timer')以后,接着就可以开始执行主函数_BackupDB()了。而_BackupDB()里有一个Msgbox,到了这里就不执行了。所以,不是Msgbox阻断了AdlibRegiste,而是AdlibRegiste把Msgbox阻断了。
发表于 2014-3-23 22:43:24 | 显示全部楼层
计算时差用这个:
Dim $hTimer = TimerInit()
Sleep(1000)
Dim $iDiff = TimerDiff($hTimer)
MsgBox(4096, "时间差", $iDiff)
 楼主| 发表于 2014-3-23 23:24:12 | 显示全部楼层
本帖最后由 smooth 于 2014-3-23 23:35 编辑

回复 4# haijie1223

计算时差我已经做了。

Local $hTimer = TimerInit()
;……………………………………
Local $iDiff = TimerDiff($hTimer)
If MsgBox(68, '导入情况检测', '数据导入完成,共耗时 ' & Int($iDiff / 1000 / 60) & ' 分 ' & Int(Mod($iDiff / 1000, 60)) & ' 秒。它可能是成功的,具体请查看日志文件。是否打开日志文件?', '', $Form1) = 6 Then
    ShellExecute($GUICtrlRead8 & '\' & $GUICtrlRead12)
EndIf


我还想在界面上出现一个时钟,从执行主函数开始计时,这样可以看到执行耗用时间的过程,而时差只能是看到一个结果。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-3-23 23:43:47 | 显示全部楼层
不明白你到底想怎么写,但是看你的代码很混乱,你一楼给出的代码GUI还没有显示呢,你就GUIDelete了。还有AdlibRegister本身就是个循环执行了,你干嘛还在函数里面重复计算?就算重新计算,也不要用while 1, 这样的话你这个循环似乎永远都跳不出来了。没有具体代码只能看到这些问题了,你自己再研究一下吧,睡觉去了~
 楼主| 发表于 2014-3-24 08:43:45 | 显示全部楼层
回复 6# haijie1223

不知道怎么了,我复制出来代码乱了,我现在修正了。我的目的很简单,就是当程将要序执行主函数_BackupDB()之际,创建一个GUI用来显示一个如上图的计时时钟,_BackupDB()执行完毕,然后GUIDelete这个GUI。
 楼主| 发表于 2014-3-24 11:22:39 | 显示全部楼层
本帖最后由 smooth 于 2014-3-24 11:40 编辑

回复 6# haijie1223

我把while 1循环去掉了(这个好像是用不到的),但是也不能退出界面,好像AdlibRegister是个死循环,退也退不出来,并且遇到runwait之类的等待函数,就会导致程序中断,真不会用这个函数。计时器本身就是要用循环才能计时,而进入了计时循环之后,又不会去执行其他代码了。看来没有多线程,甭想用计时器了。
发表于 2014-3-24 12:34:40 | 显示全部楼层
去除timer里的sleep,这个timer是自动250ms执行一次的,不需要 sleep
发表于 2014-3-24 16:52:59 | 显示全部楼层
我们周一是最忙的一天,才回来,没有细看。。。
Global $Form_M = GUICreate("", 280, 100, -1, -1)
GUICtrlCreateLabel("正在执行备份操作,请稍候...... ", 30, 40, 180, 80)
Global $time = GUICtrlCreateLabel("00:00:00 ", 24, 12, 240, 40)
GUICtrlSetFont(-1, 50, 400, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
WinWaitActive($Form_M)
WinSetOnTop($Form_M, "", 1)
AdlibRegister('timer', 1000)
_BackupDB()
AdlibUnRegister('Timer')
GUIDelete($Form_M)
Func timer()
        $k = Number(StringLeft(GUICtrlRead($time), 2))
        $i = Number(StringMid(GUICtrlRead($time), 4, 2))
        $j = Number(StringRight(StringTrimRight(GUICtrlRead($time), 1), 2))
        If $j <> 59 Then
                $j += 1
        Else
                $j = 0
                If $i < 59 Then
                        $i += 1
                Else
                        $i = 0
                        If $k < 23 Then
                                $k += 1
                        Else
                                $k = 0
                        EndIf
                EndIf
        EndIf
        GUICtrlSetData($time, StringFormat("%02d:%02d:%02d\n", $k, $i, $j))
EndFunc   ;==>timer

Func _BackupDB()
        Sleep(5000)
EndFunc   ;==>_BackupDB
 楼主| 发表于 2014-3-24 21:28:39 | 显示全部楼层
回复 10# haijie1223

兄弟,按照你修改之后的就可以了,非常感谢!但是我想不明白为什么这样修改了一下就可以了,难道就是因为函数里面的那个sleep(1000)吗?你修改之后的循环时间是在AdlibRegister定义。就因为这个吗?
发表于 2014-3-24 21:56:27 | 显示全部楼层
学习了,不错
发表于 2014-3-25 06:56:33 | 显示全部楼层
回复 11# smooth


    无语~多看帮助吧~这些问题完全'能自己解决~
 楼主| 发表于 2014-3-25 08:58:58 | 显示全部楼层
回复 13# haijie1223

不看帮助是不可能的,但是看了很多东西不一定就能找到原因,可能是方法不对。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-3-25 09:54:22 | 显示全部楼层
我也来学习了哈哈
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 21:07 , Processed in 0.092913 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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