AU3-循环的注意问题
[color=#40902c]#include<guiconstants.au3>[/color][color=#40902c]#include<process.au3>
$main=guicreate("",200,200)[/color]
[color=#40902c]$b1=guictrlcreatebutton("dos",10,10,40,20)[/color]
[color=#40902c]$b2=guictrlcreatebutton("d:\",80,10,40,20)[/color]
[color=#40902c]$b3=guictrlcreatebutton("exit",140,10,40,20)
GUISetState()
While 1
$msg=GUIGetMsg()
If $msg=$b1 Then
_RunDOS("dir c:\*.* /s ")
EndIf
If $msg=$b2 Then
Run("explorer d:\","")
EndIf
If $msg=$b3 Then ExitLoop
WEnd[/color]
一般来说按钮是不会受其它因素影响的,之所以exit按钮无效,那是因为循环已经进入了_RunDOS("dir c:\*.* /s ")这一句里面执行_RunDOS函数了。
看看所谓的_RunDOS函数是怎么定义吧(AutoIt的Include目录下找Process.au3文件):
[color=#916f8a]Func _RunDOS($sCommand)
Return RunWait(@ComSpec & " /C " & $sCommand, "", @SW_HIDE)
EndFunc ;==>_RunDOS
[/color][color=#000000]原来只不过是调用了RunWait函数而已。那么为什么循环会进入到这个函数里之后就没有出去呢?原因很明显了,看看帮助文档,RunWait 函数是“运行一个外部程序并暂停脚本的执行直至该程序执行完毕”,相应解释:
[color=#1111ee]
在指定的程序运行时脚本将暂停执行直到该程序终止为止。若要运行该程序并立即继续执行脚本的后面语句请使用 Run 函数代替。[/color][/color]
[color=#000000][color=#1111ee][color=#000000]这样问题就水落石出了:循环在进入函数后没有能“及时”地“出来”(回到主循环体语句),循环体无法捕捉其它按钮的消息,此时按它自然就“没作用”了。至于为什么会在函数里“耽搁”那么久,则是因为所执行的命令“dir c:\*.* /s”比较耗时。[/color]
[/color]既然所谓的_RunDOS也不过是这么简单,那我们当然就可以自己编写一个,这样就可以解决循环的问题了。[/color]
[color=#000000][color=#f70968]由此,我们应该在编写程序的时候特别注意循环语句,如果有可能会让程序进入某个子程序(函数)后长时间无法跳回调用体(循环体)的话,就必须优化它,否则将导致程序“反应迟钝”。[/color]
[/color] 精华...菜鸟学习ing............. 调用pdf函数是要看看情况才行。
另外,现在的gui设计器,好像使用
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_MINIMIZE
WinSetState("Form1","",@SW_MINIMIZE)
EndSwitch
Switch比if好一些。楼主使用的还是老的编辑器吧
页:
[1]