haorui658 发表于 2010-3-2 19:57:34

怎么不用热键而用一个按钮终止一个循环?[已解决]

本帖最后由 haorui658 于 2010-3-7 13:56 编辑

Start按钮的开始的循环怎么用Stop按钮终止呢?我知道热键可以,但是按钮可以吗?#include <GUIConstants.au3>
$var = 1
$pause=False
$Mail = GUICreate("邮件发送", 450, 500)
$Group1 = GUICtrlCreateGroup("基本配置", 8, 8, 330, 300)
$SmtpServer_Label = GUICtrlCreateLabel("SMTP服务器", 20,40, 80, 20)
$UP_Label = GUICtrlCreateLabel ("用户名/密码", 20,70, 80, 20)
$FromAddress_Label = GUICtrlCreateLabel ("From", 20,100, 80, 20)
$To_Label = GUICtrlCreateLabel ("To", 20,130, 80, 20)
$Subject_Label = GUICtrlCreateLabel ("标题", 20,160, 80, 20)
$Body_Label = GUICtrlCreateLabel ("正文", 20,190, 80, 20)
$Start_Label = GUICtrlCreateLabel ("起始", 20,360, 80, 20)
$Start_Label = GUICtrlCreateLabel ("数量", 80,360, 80, 20)

$SMTP = GUICtrlCreateInput ("", 100,40, 220, 20)
$Username = GUICtrlCreateInput ("", 100, 70, 100, 20)
$Password= GUICtrlCreateInput ("", 220, 70, 100, 20,0x0020 )
$From= GUICtrlCreateInput("", 100, 100, 220, 20)
$To =GUICtrlCreateInput("", 100,130, 220, 20)
$Subject =GUICtrlCreateInput("subject", 100,160, 220, 20)
$Body = GUICtrlCreateEdit("Mail Body", 100,190, 220, 100)


$Start = GUICtrlCreateButton("Start", 340, 200, 70)
$Stop = GUICtrlCreateButton("Stop", 340, 280, 70)

GUISetState(@SW_SHOW)
       
While 1
$msg = GUIGetMsg()

Select
Case $msg = $Start
          While($var <= 2000 )
                                   MsgBox(0,"","Send")
                                   ;sendmail ()
                                   $var = $var + 1
                                   if $pause=true then exitloop
                          Sleep(500)
                  WEnd
        Case $msg = $Stop
            $pause=true                  
                Case $msg = $GUI_EVENT_CLOSE
                               Exit
        EndSelect
WEnd

Func sendmail ()
        ;.....发送邮件
EndFunc

afan 发表于 2010-3-2 20:03:04

参考下
http://www.autoitx.com/forum.php?mod=redirect&goto=findpost&ptid=13154&pid=138894&fromuid=7644923

haorui658 发表于 2010-3-2 20:25:19

回复 2# afan


    我把代码改了,依旧不行,可能我邯郸学步了,望指正 While($var <= 2000 )
        $nMsg1 = GUIGetMsg()
                        If $nMsg1 = $Stop then Exit
                MsgBox(0,"","Send")
                sendmail ()
                var = $var + 1                                  
WEnd

llztt 发表于 2010-3-2 20:27:18

要达到你的目的得用AdlibRegister

afan 发表于 2010-3-2 20:33:59

回复 3# haorui658


    这里不要用 Msgbox() 调试,会间接影响 GUIGetMsg()

ddx13 发表于 2010-3-2 21:15:18

本帖最后由 ddx13 于 2010-3-2 21:16 编辑

晕,看错题目。

haorui658 发表于 2010-3-2 21:18:51

回复 5# afan


    但是去掉MSgbox问题依旧,用AdlibRegister怎么解决呢?

llztt 发表于 2010-3-2 21:27:31

本帖最后由 llztt 于 2010-3-2 21:56 编辑

我去试试写个例子

C.L 发表于 2010-3-2 22:07:18

本帖最后由 C.L 于 2010-3-2 22:09 编辑

回复 1# haorui658

可以,帮你改下代码,另外,你在循环内用太大的sleep会很影响响应,也改了一下,为了显示效果,按钮加了颜色区分,代码如下:
#include <GUIConstants.au3>

Opt ("GUIOnEventMode",1)

$var = 1
$pause=False
$Mail = GUICreate("邮件发送", 450, 500)
GUISetOnEvent ($GUI_EVENT_CLOSE,"_exit")
$Group1 = GUICtrlCreateGroup("基本配置", 8, 8, 330, 300)
$SmtpServer_Label = GUICtrlCreateLabel("SMTP服务器", 20,40, 80, 20)
$UP_Label = GUICtrlCreateLabel ("用户名/密码", 20,70, 80, 20)
$FromAddress_Label = GUICtrlCreateLabel ("From", 20,100, 80, 20)
$To_Label = GUICtrlCreateLabel ("To", 20,130, 80, 20)
$Subject_Label = GUICtrlCreateLabel ("标题", 20,160, 80, 20)
$Body_Label = GUICtrlCreateLabel ("正文", 20,190, 80, 20)
$Start_Label = GUICtrlCreateLabel ("起始", 20,360, 80, 20)
$Start_Label = GUICtrlCreateLabel ("数量", 80,360, 80, 20)

$SMTP = GUICtrlCreateInput ("", 100,40, 220, 20)
$Username = GUICtrlCreateInput ("", 100, 70, 100, 20)
$Password= GUICtrlCreateInput ("", 220, 70, 100, 20,0x0020 )
$From= GUICtrlCreateInput("", 100, 100, 220, 20)
$To =GUICtrlCreateInput("", 100,130, 220, 20)
$Subject =GUICtrlCreateInput("subject", 100,160, 220, 20)
$Body = GUICtrlCreateEdit("Mail Body", 100,190, 220, 100)

$Start = GUICtrlCreateButton("Start", 340, 200, 70)
GUICtrlSetOnEvent (-1,"_start")
$Stop = GUICtrlCreateButton("Stop", 340, 280, 70)

GUISetState(@SW_SHOW)
      
While 1
Sleep (1000)
WEnd

Func _exit ()
        Exit
EndFunc

Func _start ()
        $time = TimerInit ()
        While Int(TimerDiff ($time)/1000) <= 1000
               Opt ("GUIOnEventMode",0)
               ToolTip ("Send")
                ;sendmail ()
                If $pause == True Then
                        GUICtrlSetBkColor ($stop,0xff0000)
                Else
                        GUICtrlSetBkColor ($stop,0x00ff00)
                EndIf
                $msg = GUIGetMsg()
                if $pause=true then
                        $pause = Not $pause
                        Opt ("GUIOnEventMode",1)
                        exitloop
                EndIf
               
                Switch $msg
                        Case $Stop                               
                                $pause = Not $pause
                EndSwitch
        WEnd
EndFunc

Func sendmail ()

      ;.....发送邮件

EndFunc

afan 发表于 2010-3-2 22:17:09

仍用消息循环的例子,LZ根据实际情况看着办吧#include <GUIConstants.au3>
$var = 1
$pause = False
$Mail = GUICreate("邮件发送", 450, 500)
$Group1 = GUICtrlCreateGroup("基本配置", 8, 8, 330, 300)
$SmtpServer_Label = GUICtrlCreateLabel("SMTP服务器", 20, 40, 80, 20)
$UP_Label = GUICtrlCreateLabel("用户名/密码", 20, 70, 80, 20)
$FromAddress_Label = GUICtrlCreateLabel("From", 20, 100, 80, 20)
$To_Label = GUICtrlCreateLabel("To", 20, 130, 80, 20)
$Subject_Label = GUICtrlCreateLabel("标题", 20, 160, 80, 20)
$Body_Label = GUICtrlCreateLabel("正文", 20, 190, 80, 20)
$Start_Label = GUICtrlCreateLabel("起始", 20, 360, 80, 20)
$Start_Label = GUICtrlCreateLabel("数量", 80, 360, 80, 20)
$Label = GUICtrlCreateLabel("准备", 80, 400, 80, 20)
$SMTP = GUICtrlCreateInput("", 100, 40, 220, 20)
$Username = GUICtrlCreateInput("", 100, 70, 100, 20)
$Password = GUICtrlCreateInput("", 220, 70, 100, 20, 0x0020)
$From = GUICtrlCreateInput("", 100, 100, 220, 20)
$To = GUICtrlCreateInput("", 100, 130, 220, 20)
$Subject = GUICtrlCreateInput("subject", 100, 160, 220, 20)
$Body = GUICtrlCreateEdit("Mail Body", 100, 190, 220, 100)


$Start = GUICtrlCreateButton("Start", 340, 200, 70)
$Stop = GUICtrlCreateButton("Stop", 340, 280, 70)

GUISetState(@SW_SHOW)

While 1
        $msg = GUIGetMsg()

        Select
                Case $msg = $Start
                        $var = 1
                        While ($var <= 2000)
                                $nMsg = GUIGetMsg()
                                If $nMsg = $Stop Then ExitLoop (MsgBox(0, 0, 'Stop'))
                                GUICtrlSetData($Label, 'Send' & $var)
                                sendmail()
                                $var += 1
                        WEnd

                Case $msg = $GUI_EVENT_CLOSE
                        Exit
        EndSelect
WEnd

Func sendmail()
        Sleep(50)
        ;.....发送邮件
EndFunc   ;==>sendmail

haorui658 发表于 2010-3-2 22:49:19

十分感谢C.L和afan,受教了:face (36):

haorui658 发表于 2010-3-2 23:18:58

本帖最后由 haorui658 于 2010-3-2 23:30 编辑

当afan的send程序中sleep时间为50ms时还可以,但是要是1000ms或者更长的间隔时间的话就不行了?汗 问题有点多

netegg 发表于 2010-3-3 08:24:16

本帖最后由 netegg 于 2010-3-3 08:54 编辑

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
。。。
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
        #forceref $hWnd, $Msg
        Local $nNotifyCode = BitShift($wParam, 16)
        Local $hCtrl = $lParam
       
        Switch $hCtrl
                Case $btn, $Stop
                        Switch $nNotifyCode
                                Case $BN_CLICKED
                                     exit
                        endswitch
                        Return 0
        EndSwitch
        Return $GUI_RUNDEFMSG
endfunc
只是做个参考,结合你的程序自己改吧

afan 发表于 2010-3-3 15:23:45

用LS蛋蛋说的注册系统消息的方法也不错,LZ可以试试,应该可以解决 sleep N长造成的 GUIGetMsg() 不响应的问题

haorui658 发表于 2010-3-3 17:57:48

好的 我有时间试试 恩 一个小帖子让我受益匪浅啊
页: [1] 2
查看完整版本: 怎么不用热键而用一个按钮终止一个循环?[已解决]