大叔 发表于 2016-11-9 14:42:31

简单的 while 与IF 结合 IF有问题 但我找不到问题 [已解决]

本帖最后由 大叔 于 2017-1-19 23:42 编辑

先上代码这是第一部分代码有问题的#include <Date.au3>
$a = 0
While 1
        Sleep(200)
        If StringRight(@SEC, 1) = $a Then;;0
                $a = 5
                FileWriteLine("321.txt", _NowCalc())
        EndIf
        If StringRight(@SEC, 1) = $a Then;;5
                $a = 0
                FileWriteLine("321.txt", _NowCalc())
        EndIf
WEnd我想当前时间秒数个位为5或0时执行一个动作一次
但上面的代码跑出来的结果是下面这样的
2016/11/09 14:00:20
2016/11/09 14:00:25
2016/11/09 14:00:25
2016/11/09 14:00:30
2016/11/09 14:00:35
2016/11/09 14:00:35
2016/11/09 14:00:40
2016/11/09 14:00:45
2016/11/09 14:00:45
2016/11/09 14:00:50
2016/11/09 14:00:55
2016/11/09 14:00:55
2016/11/09 14:01:00
很明显 5秒的时候多执行了一次.
我折腾一下午找不出原因. AUTOIT 3.3.6.1
换成Switch判断秒数就是正常的
难道我又犯了幼稚的错误?
这是第二部分代码没有问题OK的#include <Date.au3>
$a = 0
While 1
        Sleep(200)
        Switch StringRight(@SEC, 1)
                Case 5
                        If $a = 0 Then
                                $a = 5
                                FileWriteLine("321.txt", _NowCalc())
                        EndIf
                Case 0
                        If $a = 5 Then
                                $a = 0
                                FileWriteLine("321.txt", _NowCalc())
                        EndIf
        EndSwitch
WEnd2016/11/09 14:21:00
2016/11/09 14:21:05
2016/11/09 14:21:10
2016/11/09 14:21:15
2016/11/09 14:21:20
2016/11/09 14:21:25
2016/11/09 14:21:30
2016/11/09 14:21:35
2016/11/09 14:21:40
2016/11/09 14:21:45
2016/11/09 14:21:50
2016/11/09 14:21:55
2016/11/09 14:22:00
2016/11/09 14:22:05
2016/11/09 14:22:10
2016/11/09 14:22:15
2016/11/09 14:22:20

nmgwddj 发表于 2016-11-9 14:56:12

在 05 的时候,while 循环执行速度很快,执行了两次,取到的时间末尾一位一直是 5,所以打印两次(或多次)。

大叔 发表于 2016-11-9 15:01:43

本帖最后由 大叔 于 2016-11-9 15:03 编辑

在 05 的时候,while 循环执行速度很快,执行了两次,取到的时间末尾一位一直是 5,所以打印两次(或多次) ...
nmgwddj 发表于 2016-11-9 14:56 http://www.autoitx.com/images/common/back.gif


    在05第一次执行的时候 $a = 0 下次应该不满足If StringRight(@SEC, 1) = $a 这个条件才对.

liuyilun 发表于 2016-11-9 15:33:53

本帖最后由 liuyilun 于 2016-11-9 16:03 编辑

#include <Date.au3>
While 1
      Sleep(1000)
      If StringRight(@SEC, 1) = 0 Then;;0
                FileWriteLine("321.txt", _NowCalc())
      ElseIf StringRight(@SEC, 1) = 5 Then;;5
                FileWriteLine("321.txt", _NowCalc())
      EndIf
WEnd5秒的时候先运行了第一个if再运行了第二个if所以5秒会输出2次
这样不可以吗

大叔 发表于 2016-11-9 17:02:41

本帖最后由 大叔 于 2016-11-9 17:07 编辑

回复 4# liuyilun


谢谢亲. 我换成Switch判断后问题解决了. 我只是想知道为什么会出现这样的结果5秒的时候不应该两个if都运行.

liuyilun 发表于 2016-11-9 17:39:20

回复 5# 大叔

0秒时给 $a赋值5
5秒时StringRight(@SEC, 1)=5$a = 5 运行第一个if, $a赋值5
然后StringRight(@SEC, 1)=5$a = 5运行第二个if

大叔 发表于 2016-11-9 18:07:11

本帖最后由 大叔 于 2016-11-9 18:11 编辑

回复 6# liuyilun

5秒时StringRight(@SEC, 1)=5$a = 5 运行第一个if, $a赋值是0   请看第一部分代码   第二部分是OK的.

5的时候 $a=0
0的时候 $a=5
加这个就是为了防止重复运行.

afan 发表于 2016-11-9 19:40:31

本帖最后由 afan 于 2016-11-9 20:19 编辑

$a 为 0 时执行一次;而$a 为 5 时会执行两次,代入便知~
也可以如下#include <Date.au3>
Local $a, $b
While 1
        Sleep(200)
        $a = StringRight(@SEC, 1)
        If ($a = 0 Or $a = 5) Then
                If $b = 0 Then
                        FileWriteLine("321.txt", _NowCalc())
                        $b = 1
                Endif
        Else
                $b = 0
        EndIf
WEnd

lxwlxwayy 发表于 2016-11-9 20:50:41

帮你顶点{:face (131):}

大叔 发表于 2016-11-10 10:04:19

回复 6# liuyilun


感谢亲.是我的理解有问题,   果然是我犯了幼稚的错误
你说的没错当秒数个位等于5的时候两个IF 都执行了
我错误以为是5的那个IF 执行了两次
我修改了代码才发现问题. 再次感谢
#include <Date.au3>
$a = 0
While 1
      Sleep(200)
      If StringRight(@SEC, 1) = $a Then;;0
                $a = 5
                FileWriteLine("321.txt", _NowCalc()&"0")
      EndIf
      If StringRight(@SEC, 1) = $a Then;;5
                $a = 0
                FileWriteLine("321.txt", _NowCalc()&"5")
      EndIf
WEnd

大叔 发表于 2016-11-10 10:07:38

回复 8# afan


    感谢A版
这弯我转过来了.
为5时会执行两次   是两个IF 都执行了
而不是其中一个IF执行了两次我理解错误
页: [1]
查看完整版本: 简单的 while 与IF 结合 IF有问题 但我找不到问题 [已解决]