sword3312 发表于 2013-5-22 10:53:30

求救大神!我想制作个提供倒数后运行程序的软件,但有问题

我想制作个提供倒数后运行程序的软件,制作了两个按键,但点击都不产生作用,只有把sleep和i=i-1注释掉才能生效,为什么?怎么解决?

#AutoIt3Wrapper_Run_Debug_Mode=Y
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate("自动输出", 297, 150, 192, 124,$WS_DLGFRAME,$WS_EX_TOPMOST)
GUICtrlCreateLabel("20秒后输出,如正在使用,请取消",0,0)
$Button1 = GUICtrlCreateButton("倒计时(20秒)运行", 20, 72, 80, 33)
$Button2 = GUICtrlCreateButton("退出",130,72,30,33)
GUISetState(@SW_SHOW)
Local $i = 20
While $i <> 0
                $msg=GUIGetMsg()
                $i = $i - 1
      Sleep(1000)
                GUICtrlSetData($Button1, "倒计时("&$i&"秒)")
                If $msg=$Button2 Then Exit
                If $msg=$Button1 Then ExitLoop
WEnd
If ProcessExists("QCSoft.exe") Then WinActivate("")

afan 发表于 2013-5-22 11:23:25

http://www.autoitx.com/search.php?searchid=94&searchsubmit=yes

haijie1223 发表于 2013-5-22 12:01:59

下一步就是大仙了~hoho
{:face (303):}

1361739590 发表于 2013-5-22 14:55:28

其实是有用的   但是你Sleep了1秒   导致while循环一次时间长,当你点按钮时候还没执行$msg=GUIGetMsg()   你把倒计时弄长点,多点几次就发现有用。这两个步骤并行运行比较好

shqf 发表于 2013-5-23 10:59:16

本帖最后由 shqf 于 2013-5-23 11:02 编辑

SLEEP是延迟时间,就是暂停脚本运行一定时间,用此来获得倒计秒数,在延迟时段内程序是没法响应的。
可用timer函数或_DateDiff等。如下timer函数解决:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate("自动输出", 297, 150, 192, 124, $WS_DLGFRAME, $WS_EX_TOPMOST)
GUICtrlCreateLabel("20秒后输出,如正在使用,请取消", 20, 20)
$Button1 = GUICtrlCreateButton("倒计时(20秒)运行", 20, 72, 120, 30)
$Button2 = GUICtrlCreateButton("退出", 150, 72, 70, 30)
GUISetState(@SW_SHOW)
Local $hTimer = TimerInit()
Local $i=20

While $i<>0
        $msg = GUIGetMsg()
        If $msg = $Button2 Then Exit
        If $msg = $Button1 Then ExitLoop
        Local $iDiff = TimerDiff($hTimer)
        $i = 20 - Int($iDiff / 1000)
        If GUICtrlRead($Button1) <> "倒计时(" & $i & "秒)" Then
                GUICtrlSetData($Button1, "倒计时(" & $i & "秒)")               
        EndIf
WEnd
If ProcessExists("QCSoft.exe") Then WinActivate("")

fccfx8 发表于 2013-5-30 20:17:18

还可以嘛这个

破帽遮颜 发表于 2013-5-30 23:23:03

支持,,~~~~~~~~~~

flyeblue 发表于 2013-5-31 11:59:49

应该用AdlibRegister ( "函数" [, 时间] )定义一个专门的函数用来倒数,不能将倒计时的跟主程序一起,autoit是单进程语言,是一步步执行代码的,执行暂停整个程序就直接失去响应了,

flyeblue 发表于 2013-5-31 12:20:33

本帖最后由 flyeblue 于 2013-5-31 12:23 编辑

回复 1# sword3312 $IsStart = False ;用来标记是否开始倒计时
$Daojishi = 100 ;这个用来记录总共倒计时的时间,单位秒

Func _DaojishiJishi()
      ;这个用来做倒计时
        If $IsStart Then
                $Daojishi = $Daojishi - 1
                If $Daojishi<1 Then
                        _JieshuDaojishi()
                EndIf
        EndIf
EndFunc   ;==>_Daojishi

Func _JieshuDaojishi()
        ;这里用来实现倒计时结束的时候的程序动作,记得不能少了下面这句
        $IsStart=False
EndFunc       

;开始倒计时的地方应该这么用
;首先定义倒计时的总时间
$Daojishi=1000
;然后开始倒计时
$IsStart=True
_DaojishiJishi()
AdlibRegister('_DaojishiJishi',1000) ;这里的1000表示的一秒,如果要修改计时频率就要修改这个,上面倒计时的时间是这个的整数倍
页: [1]
查看完整版本: 求救大神!我想制作个提供倒数后运行程序的软件,但有问题