xyyie 发表于 2010-11-8 13:16:36

怎么在循环外部退出循环[已解决]

本帖最后由 xyyie 于 2010-11-9 10:20 编辑

我想实现点击莫个按钮执行以个函数函数内部有循环,然后点击停止按钮结束执行这个函数循环。

_ddqs. 发表于 2010-11-8 13:53:59

本帖最后由 _ddqs. 于 2010-11-8 14:04 编辑

开始按钮 执行: AdlibRegister(" 某个循环函数")

停止按钮 执行: AdlibunRegister(" 某个循环函数")

·可能不好,看下层。。。

_ddqs. 发表于 2010-11-8 13:58:06

本帖最后由 _ddqs. 于 2010-11-8 14:11 编辑





Global$exitloop =0

开始按钮 执行: AdlibRegister("某个循环函数")

停止按钮 执行: $exitloop =1



Func 某个循环函数()
       
       
        循环开始

                If $exitloop =1 Then
                        $exitloop =0
                        ExitLoop
                EndIf

        循环结束
       
        ...
       

EndFunc


xianhou 发表于 2010-11-8 15:54:51

使用一个全局变量
在循环内部,适当的时候,检查这个变量的量,来决定怎么处理。
或者,在循环外,直接dele这个窗口。

gapkiller 发表于 2010-11-8 16:44:14

方法有很多种
你可以把按钮做到循环中去~
或者使用GUI OnEvent Mode

foboy 发表于 2010-11-8 17:39:59

对, 在循环内部监测某个变量,这个变量达到条件就退出循环。
然后你设置按下按钮时改变这个变量,让他达到退出循环的条件。

baikaifang 发表于 2010-11-8 21:24:29

在函数内部加入GUIGetMsg()捕获消息,可参考以下代码。#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $Label1, $Button1

$Form1 = GUICreate("示例", 283, 152, 192, 124)
$Label1 = GUICtrlCreateLabel("", 104, 32, 60, 25)
$Button1 = GUICtrlCreateButton("开始", 48, 88, 75, 25)
$Button2 = GUICtrlCreateButton("退出", 152, 88, 75, 25)
GUISetState(@SW_SHOW)


While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE, $Button2
                        Exit
                Case $Button1
                        If GUICtrlRead($Button1) = '开始' Then
                                GUICtrlSetData($Button1, '停止')
                        Else
                                GUICtrlSetData($Button1, '开始')
                        EndIf
                        _Test()

        EndSwitch
WEnd


Func _Test()
       
        Local $i = 0, $nMsg
        While 1
                $nMsg = GUIGetMsg()
                Switch $nMsg
                        Case $GUI_EVENT_CLOSE, $Button2
                                Exit
                        Case $Button1
                                Return False
                EndSwitch               
                GUICtrlSetData($Label1, $i)
                $i += 1
        WEnd       
        Return True
       
EndFunc

xyyie 发表于 2010-11-9 10:19:42

谢谢大家了。问题已经解决了。

xyyie 发表于 2010-11-10 11:37:23

经过我的测试 在函数内部加入GUIGetMsg()捕获消息 可以实现退出循环
但是反映有点慢
使用全局变量好像不行。

changwang 发表于 2012-8-24 19:23:55

正要解决类似的问题,学习啦

changwang 发表于 2012-8-24 19:29:32

但是我想,不管什么时候,只要点击退出,就马上退出,有方法实现吗?
比如在Func start_click()
While 1
      Sleep(1000)
    WEnd
EndFunc
Func stop_click()
        MsgBox(0,"asdf","asdf")
EndFunc个程序中,我想不管什么时候,只要一点击stop_click(),程序就马上执行,而不是等那个sleep(1000)执行完毕

athland5013 发表于 2012-8-25 00:42:49

回复 11# changwang

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 438, 192, 124)
$Edit1 = GUICtrlCreateEdit("", 32, 24, 545, 201)
$Button1 = GUICtrlCreateButton("start_click", 104, 256, 121, 41)
$Button2 = GUICtrlCreateButton("stop_click", 328, 256, 121, 41)
$hButton = GUICtrlGetHandle($Button2)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

;===============================================
Global $num, $Paused, $stop = False
HotKeySet("{PAUSE}", "AutoIt_Pause")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
;===============================================

While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        start_click()
        EndSwitch
WEnd

Func start_click()
        $stop = False
        While 1
                Sleep(100)
                GUICtrlSetData($Edit1, $num & @CRLF, 1)
                $num += 1
                If $stop Then ExitLoop;也可以是Return
        WEnd
        GUICtrlSetData($Edit1, '$stop = ' & $stop & @CRLF, 1)
        GUICtrlSetData($Edit1, '该函数已经退出', 1)
EndFunc   ;==>start_click

Func AutoIt_Pause()
        $stop = True
EndFunc   ;==>AutoIt_Pause

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        $iCode = BitShift($iwParam, 16)
        Switch $ilParam
                Case $hButton
                        If $iCode = $BN_CLICKED Then $stop = True
        EndSwitch
EndFunc   ;==>WM_COMMAND


这里有一个较为理想的方法

changwang 发表于 2012-8-25 21:05:31

回复 12# athland5013
多谢啦,哈哈

au3x 发表于 2012-12-4 09:43:32

回复 5# gapkiller

可以给个例子吗?

au3x 发表于 2012-12-4 09:50:23

回复 6# foboy


    理论上不错,我有小小明白,不过,能不能给个例子呢?
页: [1] 2
查看完整版本: 怎么在循环外部退出循环[已解决]