lele9013 发表于 2008-12-2 11:34:05

大问题,在gui里面 用 While 循环 怎么用按钮退出啊?

搞了一个 循环ping 显示在ListView

可是 While 后 按钮都失去响应了

一直循环下去了

请问该如何处理

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>

#include <WindowsConstants.au3>
#include <GuiListView.au3>

Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$ccc=0
$111=-1
$aaa=0
$Form1 = GUICreate("Form1", 458, 360, 435, 318)
$ListView1 = GUICtrlCreateListView("服务器昵称    |IP/域名            |状态   |丢包情况", 8, 24, 440, 289)

        _GUICtrlListView_SetExtendedListViewStyle($ListView1 , BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))


$var = IniReadSection("Ip.ini", "服务器")
If @error Then
    MsgBox(4096, "", "发生错误,可能目标文件并非标准的INI文件.")
Else
    For $i = 1 To $var
   

GUICtrlCreateListViewItem($var[$i] & "|" & $var[$i] & "|待测 |待测" , $ListView1)

    Next
EndIf

$Button2 = GUICtrlCreateButton("停止检测", 375, 320, 75, 25)
GUICtrlSetFont(-1, 9, 400, 0, "宋体")
GUICtrlSetOnEvent(-1,"sotp")


$Button1 = GUICtrlCreateButton("开始检测", 288, 320, 75, 25)
GUICtrlSetOnEvent(-1,"pingla")

GUICtrlSetFont(-1, 9, 400, 0, "宋体")
$Checkbox1 = GUICtrlCreateCheckbox("日志记录", 210, 325, 65, 17)
GUICtrlSetFont(-1, 9, 400, 0, "宋体")
GUISetOnEvent($GUI_EVENT_CLOSE, "qut")

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###



While 1

Sleep (150)

WEnd


Func sotp()

RegWrite("HKEY_CURRENT_USER\Software\ping","ping",'Reg_sz',"yes")       
$ccc=10
EndFunc

Func pingla()


While $ccc<>10
                $111=-1

$ok=RegRead("HKEY_CURRENT_USER\Software\ping","ping")

if $ok="yes"Then
       
        $ccc=10
       
       
        RegDelete("HKEY_CURRENT_USER\Software\ping","ping")
                ExitLoop

        EndIf

$var = IniReadSection("Ip.ini", "服务器")
If @error Then
    MsgBox(4096, "", "发生错误,可能目标文件并非标准的INI文件.")
Else
    For $i = 1 To $var
$aaa=0

        $111=$111+1
                        $1 = Ping($var[$i],250)
                               
                                if @error Then
                                $aaa=$aaa+1
                _GUICtrlListView_AddSubItem($ListView1, $111, "第一次失败", 2)
_GUICtrlListView_AddSubItem($ListView1, $111, $aaa*25&" %", 3)

                                EndIf
                               
                               
                                $2 = Ping($var[$i],250)
                                                       
                                                        if @error Then
                                $aaa=$aaa+1
                _GUICtrlListView_AddSubItem($ListView1, $111, "第二次失败", 2)
_GUICtrlListView_AddSubItem($ListView1, $111, $aaa*25&" %", 3)

                                EndIf
                               
                               
                                $3 = Ping($var[$i],250)
                                                       
                                                        if @error Then
                                $aaa=$aaa+1
                _GUICtrlListView_AddSubItem($ListView1, $111, "第三次失败", 2)
_GUICtrlListView_AddSubItem($ListView1, $111, $aaa*25&" %", 3)
                        EndIf
                                $4 = Ping($var[$i],250)
                                                       
                                                                if @error Then
                                $aaa=$aaa+1
                _GUICtrlListView_AddSubItem($ListView1, $111, "第四次失败", 2)
_GUICtrlListView_AddSubItem($ListView1, $111, $aaa*25&" %", 3)
                        EndIf

$cc=($1+$2+$3+$4)/4

if $cc=0 Then
       
        $cc="ping不通"
       
EndIf


if $cc=0 Then
       
        _GUICtrlListView_AddSubItem($ListView1, $111, $cc, 2)
       
Else
       
                _GUICtrlListView_AddSubItem($ListView1, $111, $cc&" MS", 2)

       
EndIf


_GUICtrlListView_AddSubItem($ListView1, $111, $aaa*25&" %", 3)



Sleep(200)

    Next
EndIf
       
        WEnd
EndFunc



func qut()

Exit
       
EndFunc

[ 本帖最后由 lele9013 于 2008-12-2 11:36 编辑 ]

xkowen 发表于 2008-12-2 12:16:58

回复 1# lele9013 的帖子

.......
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked") ; 设置窗口关闭事件
....
Func CLOSEClicked()
MsgBox(0, "GUI 事件", "您选择了关闭!正在退出...")
Exit
EndFunc

lele9013 发表于 2008-12-2 12:45:31

没用啦。。我已经用了GUISetOnEvent了

xkowen 发表于 2008-12-2 14:32:35

回复 3# lele9013 的帖子

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>

#include <WindowsConstants.au3>
#include <GuiListView.au3>

Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$ccc=0
$111=-1
$aaa=0
$Form1 = GUICreate("Form1", 458, 360, 435, 318)
$ListView1 = GUICtrlCreateListView("服务器昵称    |IP/域名            |状态   |丢包情况", 8, 24, 440, 289)

        _GUICtrlListView_SetExtendedListViewStyle($ListView1 , BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))


$var = IniReadSection("Ip.ini", "服务器")
If @error Then
    MsgBox(4096, "", "发生错误,可能目标文件并非标准的INI文件.")
Else
    For $i = 1 To $var
   

GUICtrlCreateListViewItem($var[$i] & "|" & $var[$i] & "|待测 |待测" , $ListView1)

    Next
EndIf

$Button2 = GUICtrlCreateButton("停止检测", 375, 320, 75, 25)
GUICtrlSetFont(-1, 9, 400, 0, "宋体")
GUICtrlSetOnEvent(-1,"sotp")


$Button1 = GUICtrlCreateButton("开始检测", 288, 320, 75, 25)
GUICtrlSetOnEvent(-1,"pingla")

GUICtrlSetFont(-1, 9, 400, 0, "宋体")
$Checkbox1 = GUICtrlCreateCheckbox("日志记录", 210, 325, 65, 17)
GUICtrlSetFont(-1, 9, 400, 0, "宋体")
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###



While 1

Sleep (150)

WEnd


Func sotp()

RegWrite("HKEY_CURRENT_USER\Software\ping","ping",'Reg_sz',"yes")       
$ccc=10
EndFunc

Func pingla()


While $ccc<>10
                $111=-1

$ok=RegRead("HKEY_CURRENT_USER\Software\ping","ping")

if $ok="yes"Then
       
        $ccc=10
       
       
        RegDelete("HKEY_CURRENT_USER\Software\ping","ping")
                ExitLoop

        EndIf

$var = IniReadSection("Ip.ini", "服务器")
If @error Then
    MsgBox(4096, "", "发生错误,可能目标文件并非标准的INI文件.")
Else
    For $i = 1 To $var
$aaa=0

        $111=$111+1
                        $1 = Ping($var[$i],250)
                               
                                if @error Then
                                $aaa=$aaa+1
                _GUICtrlListView_AddSubItem($ListView1, $111, "第一次失败", 2)
_GUICtrlListView_AddSubItem($ListView1, $111, $aaa*25&" %", 3)

                                EndIf
                               
                               
                                $2 = Ping($var[$i],250)
                                                       
                                                        if @error Then
                                $aaa=$aaa+1
                _GUICtrlListView_AddSubItem($ListView1, $111, "第二次失败", 2)
_GUICtrlListView_AddSubItem($ListView1, $111, $aaa*25&" %", 3)

                                EndIf
                               
                               
                                $3 = Ping($var[$i],250)
                                                       
                                                        if @error Then
                                $aaa=$aaa+1
                _GUICtrlListView_AddSubItem($ListView1, $111, "第三次失败", 2)
_GUICtrlListView_AddSubItem($ListView1, $111, $aaa*25&" %", 3)
                        EndIf
                                $4 = Ping($var[$i],250)
                                                       
                                                                if @error Then
                                $aaa=$aaa+1
                _GUICtrlListView_AddSubItem($ListView1, $111, "第四次失败", 2)
_GUICtrlListView_AddSubItem($ListView1, $111, $aaa*25&" %", 3)
                        EndIf

$cc=($1+$2+$3+$4)/4

if $cc=0 Then
       
        $cc="ping不通"
       
EndIf


if $cc=0 Then
       
        _GUICtrlListView_AddSubItem($ListView1, $111, $cc, 2)
       
Else
       
                _GUICtrlListView_AddSubItem($ListView1, $111, $cc&" MS", 2)

       
EndIf


_GUICtrlListView_AddSubItem($ListView1, $111, $aaa*25&" %", 3)



Sleep(200)

    Next
EndIf
       
        WEnd
EndFunc



Func CLOSEClicked()
MsgBox(0, "GUI 事件", "您选择了关闭!正在退出...")
Exit
EndFunc


我试了是可以的,怎么你就不行呢?郁闷ing...

[ 本帖最后由 xkowen 于 2008-12-2 14:34 编辑 ]

lele9013 发表于 2008-12-2 14:40:14

不是哦

你先按 开始检测 才循环啦

不检测 当然可以退出啦。。- -

xkowen 发表于 2008-12-2 14:44:34

回复 5# lele9013 的帖子

哦,这样啊!Func(61行)里面不要用While,要不然就会在While处循环,然后就无法执行关闭函数!

lele9013 发表于 2008-12-2 17:22:07

恩。。问题是 我是一直要循环ping 的。。哎 一个头大的问题

netegg 发表于 2008-12-2 18:46:51

设置一个
@error不就完了

netegg 发表于 2008-12-2 18:49:31

不是要无限循环吗,当你要的事件发生时设置一个错误信号就完了,把整个程序放在函数体内,用字程序调用的方式

[ 本帖最后由 netegg 于 2008-12-2 18:50 编辑 ]

netegg 发表于 2008-12-2 18:53:55

对了,忘了说一句,你要是自己没把握,千万别用while循环,会累死得
上次算个圆周率三天没敢关机,结果还错了

ghl781258 发表于 2008-12-2 22:28:53

以下代码定义了ESC键退出程序的热键功能
--------------------------------------------------
HotKeySet ( "{esc}" , "close" )
func close()
msgbox(0,"","程序将退出")
exit
endfunc

quintin 发表于 2008-12-2 22:36:01

While 1
_Ping()   ;把你的代码放在此处就可以,无限循环,还可以同时接收其他控件消息
Sleep (150)

WEnd

lele9013 发表于 2008-12-3 14:57:23

问题是 这样 一开始 就循环了

怎么通过 按钮 来触发呢?

之前的有人说 是Ping的特殊关系造成的。。

superflq 发表于 2008-12-12 10:03:55

原帖由 lele9013 于 2008-12-3 14:57 发表 http://www.autoitx.com/images/common/back.gif
问题是 这样 一开始 就循环了

怎么通过 按钮 来触发呢?

之前的有人说 是Ping的特殊关系造成的。。


不是这个原因,我也遇到了同样的问题,暂时只能用hotkey解决

文白 发表于 2008-12-12 12:46:27

hotkeyset 是比较有效 比较简单的方式

还可以使用其他的方式 由于使用了onevent模式
那么 添加一个$Exitbutton = GUICtrlCreateButton("Exit")
添加一个事件GUICtrlSetOnEvent($Exitbutton, "Exitbutton")
Func Exitbutton()
Exit
EndFunc
应该就能结束了
页: [1] 2
查看完整版本: 大问题,在gui里面 用 While 循环 怎么用按钮退出啊?