solox 发表于 2013-11-20 13:25:03

为什么没有办法跳出循环?

本帖最后由 solox 于 2013-11-20 13:26 编辑

#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Global $start = 0
$Form = GUICreate("Test",420,200)
$button1 = GUICtrlCreateButton("开始循环",15,10)
$button2 = GUICtrlCreateButton("停止循环",15,40)
GUISetOnEvent($GUI_EVENT_CLOSE,"_FormClose")
GUICtrlSetOnEvent($button1,"_Start")
GUICtrlSetOnEvent($button2,"_Stop")
GUISetState(@SW_SHOW)

While 1
        Sleep(10)
WEnd

Func _FormClose()
        GUIDelete($Form)
        Exit
EndFunc

Func _Start()
        $start = 1
        While $start
                循环体
        WEnd
EndFunc

Func _Stop()
        $start = 0
WEnd

cyl675 发表于 2013-11-20 15:37:02

不懂,按我的理解应该是跳不出循环的,不知道有没有DoEvents( )这类函数方法,我还有一个不理解是:为什么
GUISetOnEvent这类函数可以跳出第一个循环体运行,按照流程程序应该在While 1   Sleep(10) WEnd中死循环,不能接受任何消息,求解惑

haijie1223 发表于 2013-11-20 15:56:00

不知以下代码如何,没有循环,只需判断,能满足楼主要求吗。#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Global $start = False
$Form = GUICreate("Test", 420, 200)
$button1 = GUICtrlCreateButton("开始循环", 15, 10)
$button2 = GUICtrlCreateButton("停止循环", 15, 40)
GUISetOnEvent($GUI_EVENT_CLOSE, "_FormClose")
GUICtrlSetOnEvent($button1, "_Start")
GUICtrlSetOnEvent($button2, "_Stop")
GUISetState(@SW_SHOW)

While 1
        Sleep(10)
WEnd

Func _FormClose()
        GUIDelete($Form)
        Exit
EndFunc   ;==>_FormClose

Func _Start()
        $start = True
        AdlibRegister("xh",100)
EndFunc   ;==>_Start

Func xh()
        If $start Then
                ConsoleWrite($start & @CRLF);~                 循环体
        Else
                AdlibUnRegister("xh")
        EndIf
EndFunc   ;==>xh


Func _Stop()
        $start = False
EndFunc   ;==>_Stop

solox 发表于 2013-11-20 18:53:04

发哥,谢谢,我的循环体里面的时间因为各个实时因素的不同,延时会不同,应该无法用 AdlibRegister("xh",100) 固定100毫秒扫一次吧?

user3000 发表于 2013-11-20 19:44:15

回复 4# solox

可以这样子:Global $start = 0
$Form = GUICreate("Test", 420, 200)
$button1 = GUICtrlCreateButton("开始循环", 15, 10)
$button2 = GUICtrlCreateButton("停止循环", 15, 40)
GUISetState(@SW_SHOW)

While 1
        $msg = GUIGetMsg()
        Switch $msg
                Case -3
                        GUIDelete($Form)
                        Exit
                Case $button1
                        $start = 1               
                        While $start
                                ConsoleWrite($start & @CRLF)
                                $start += 1
                                Switch GUIGetMsg()
                                        Case -3
                                                GUIDelete($Form)
                                                Exit
                                        Case $button2
                                                $start = 0
                                EndSwitch                               
                                Sleep(10)                               
                        WEnd
        EndSwitch
WEnd

solox 发表于 2013-11-20 19:54:01

回复 5# user3000


   谢谢,这个在理想状态是可以的,问题就是如果ConsoleWrite($start & @CRLF)这一句是一大串代码呢?基本上超过100毫秒,这种写法就不行了,GUIGetMsg()大部分情况会得到$GUI_EVENT_MOUSEMOVE。

user3000 发表于 2013-11-20 20:01:29

回复 6# solox


    是啊。处理过多东西是不适合。
完美解决你的问题必须用多线程,但AU3很难做到!

haijie1223 发表于 2013-11-20 20:38:12

回复 4# solox


    这个时间可以改,可以把你的循环发上来大家看下~

solox 发表于 2013-11-20 21:20:12

本帖最后由 solox 于 2013-11-20 21:22 编辑

回复 8# haijie1223


Func _Start()
        $start = 1
        While $start
                For $i = 1 To $arrTotal
                        If $arr[$i] = True Then
                                FileWrite($LogFile,@YEAR &"-"& @MON &"-"& @MDAY &" "& @HOUR &":"& @MIN &":"& @SEC & " arr[" & $i & "] is true")
                        Else
                                Sleep(200)
                                _ReWriteArr() ;重排剩余数组函数
                                $i-=$i
                        EndIf
                Next
        WEnd
EndFunc


实际内容比这个要复杂的多,无法按“停止循环”按钮停止,头痛

haijie1223 发表于 2013-11-20 21:41:09

回复 9# solox


    似乎不是很复杂,我看可以直接放进去。
_ReWriteArr() 可否发上来~

solox 发表于 2013-11-20 21:46:52

回复 10# haijie1223


   发哥,800多行代码啊。。。主要是无法控制_ReWriteArr()的运行时间,需要Ping服务器,服务器给了反应再继续运行,这个时间无法控制,我测试过,快则几十毫秒,慢则近10秒,而我又不想以最慢的10秒为准,这样这个程序永远不可能快。

haijie1223 发表于 2013-11-20 22:03:29

回复 11# solox


   嗯,如果这样的话,就给ping加上个超时参数吧~虽然不是很准确,起码给程序可操控性。

魔导 发表于 2013-11-20 22:42:22

看了楼上几位前辈的    向发哥3000看齐~~~~~~~~~·
小弟倒是跳出来了    但跳得很是不雅观   不知楼主是否能接受   {:face (411):}#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
HotKeySet('a','_Stop')
$Form = GUICreate("Test",420,200)
$button1 = GUICtrlCreateButton("开始循环",15,10)
$button2 = GUICtrlCreateButton("停止循环",15,40)
GUISetOnEvent($GUI_EVENT_CLOSE,"_FormClose")
GUICtrlSetOnEvent($button1,"_Start")
GUICtrlSetOnEvent($button2,"_Stop")
GUISetState(@SW_SHOW)

While 1
      Sleep(10)
WEnd

Func _FormClose()
      GUIDelete($Form)
      Exit
EndFunc

Func _Start()
        IniWrite ( @ScriptDir&"\文件名.ini", "字段名", "键名",'')
        Do
                MsgBox(0,0,'还在跳,还在跳。。。')
        Until IniRead(@ScriptDir&"\文件名.ini", "字段名", "键名",0)
        MsgBox(0,0,'没电了')
EndFunc

Func _Stop()
      IniWrite ( @ScriptDir&"\文件名.ini", "字段名", "键名",1)
EndFunc

solox 发表于 2013-11-20 23:48:53

回复 13# 魔导


    你这个跟我的原程序是异曲同工,当_Start函数很大时,AU3对_Stop()函数的响应非常不好,甚至是忽略。

user3000 发表于 2013-11-21 00:30:03

回复 14# solox
那可以考虑用多进程代替,尽量简化循环函数,把循环中复杂部分做成另一EXE,每次调用时向其传递不同参数即可。
页: [1] 2
查看完整版本: 为什么没有办法跳出循环?