找回密码
 加入
搜索
查看: 8180|回复: 15

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

  [复制链接]
发表于 2010-11-8 13:16:36 | 显示全部楼层 |阅读模式
本帖最后由 xyyie 于 2010-11-9 10:20 编辑

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

评分

参与人数 1金钱 +10 收起 理由
hzxymkb + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-11-8 13:53:59 | 显示全部楼层
本帖最后由 _ddqs. 于 2010-11-8 14:04 编辑

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

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

·可能不好,看下层。。。
发表于 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
发表于 2010-11-8 15:54:51 | 显示全部楼层
使用一个全局变量
在循环内部,适当的时候,检查这个变量的量,来决定怎么处理。
或者,在循环外,直接dele这个窗口。
发表于 2010-11-8 16:44:14 | 显示全部楼层
方法有很多种
你可以把按钮做到循环中去~
或者使用GUI OnEvent Mode
发表于 2010-11-8 17:39:59 | 显示全部楼层
对, 在循环内部监测某个变量,这个变量达到条件就退出循环。
然后你设置按下按钮时改变这个变量,让他达到退出循环的条件。
发表于 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
 楼主| 发表于 2010-11-9 10:19:42 | 显示全部楼层
谢谢大家了。问题已经解决了。
 楼主| 发表于 2010-11-10 11:37:23 | 显示全部楼层
经过我的测试 在函数内部加入GUIGetMsg()捕获消息 可以实现退出循环
但是反映有点慢
使用全局变量好像不行。
发表于 2012-8-24 19:23:55 | 显示全部楼层
正要解决类似的问题,学习啦
发表于 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)执行完毕
发表于 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



这里有一个较为理想的方法
发表于 2012-8-25 21:05:31 | 显示全部楼层
回复 12# athland5013
多谢啦,哈哈
发表于 2012-12-4 09:43:32 | 显示全部楼层
回复 5# gapkiller

可以给个例子吗?
发表于 2012-12-4 09:50:23 | 显示全部楼层
回复 6# foboy


    理论上不错,我有小小明白,不过,能不能给个例子呢?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-18 20:59 , Processed in 0.098949 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表