找回密码  加入

AUTOIT CN

搜索
查看: 777|回复: 23

[系统综合] 点击刷新和退出都不成功,如何做无限制循环执行并且可以刷新和退出

[复制链接]
发表于 2018-2-7 13:59:54 | 显示全部楼层 |阅读模式
本帖最后由 heheghostxp 于 2018-2-7 14:01 编辑

用sleep做PING的循环执行, 点击刷新和退出都不成功,如何做无限制循环执行并且可以刷新和退出;若循环执行SLEEP 改用AdlibRegister 时间就会停止,报警间隔也会停止,而循环ping是正常的。各位大神如何修改?请赐教,十分谢谢
  1. #NoTrayIcon
  2. #RequireAdmin
  3. #Region ;**** 参数创建于 ACNWrapper_GUI ****
  4. #PRE_Icon=1.ico
  5. #PRE_Outfile=网络监控程序).exe
  6. #PRE_Compression=4
  7. #PRE_UseX64=n
  8. #PRE_Res_Description=网络监控程序
  9. #PRE_Res_Fileversion=1
  10. #PRE_Res_ProductVersion=
  11. #PRE_Res_LegalCopyright=
  12. #PRE_Res_requestedExecutionLevel=None
  13. #PRE_Res_Field=ProductName|网络监控程序
  14. #PRE_Run_AU3Check=N
  15. #PRE_Run_Tidy=Y
  16. #Tidy_Parameters=/sci 1
  17. #EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
  18. #Region

  19. #EndRegion
  20. #Region
  21. #EndRegion
  22. #include <Array.au3>
  23. #include <Access.au3>
  24. #include <ButtonConstants.au3>
  25. #include <Constants.au3>
  26. #include <EditConstants.au3>
  27. #include <FileConstants.au3>
  28. #include <GUIConstantsEx.au3>
  29. #include <GuiTab.au3>
  30. #include <GuiEdit.au3>
  31. #include <GuiListView.au3>
  32. #include <IE.au3>
  33. #include <ListViewConstants.au3>
  34. #include <MsgBoxConstants.au3>
  35. #include <Misc.au3>
  36. #include <process.au3>
  37. #include <Sound.au3>
  38. #include <string.au3>
  39. #include <StaticConstants.au3>
  40. #include <TabConstants.au3>
  41. #include <TrayConstants.au3>
  42. #include <WinAPIFiles.au3>
  43. #include <WindowsConstants.au3>

  44. Opt("MustDeclareVars", 1)
  45. _WinAPI_Wow64EnableWow64FsRedirection(False)
  46. ProcessSetPriority(@AutoItPID, 3)

  47. Local $form1, $auto, $BT, $Button1, $Button2, $font, $WK, $name0, $var0, $0, $0_add, $nMsg

  48. Dim $WK[8] = [8, "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]

  49. $form1 = GUICreate("网络监控程序", 400, 300)
  50. $font = "Comic Sans MS"

  51. $BT = GUICtrlCreateLabel(@YEAR & "年" & @MON & "月" & @MDAY & "日(" & $WK[@WDAY] & ")" & @LF & "  " & @HOUR & ":" & @MIN & ":" & @SEC, 105, 5, 180, 25)
  52. GUICtrlSetColor($BT, 0xff0033)
  53. AdlibRegister("_Timer", 1000)

  54. Local $Alarm = @ScriptDir & "\Alarm.wav"

  55. $name0 = IniRead(@ScriptDir & "\config.ini", "server", "name0", "")
  56. $0_add = IniRead(@ScriptDir & "\config.ini", "server", "server0", "")
  57. $Button1 = GUICtrlCreateButton("刷新", 150, 200)
  58. $Button2 = GUICtrlCreateButton("退出", 250, 200)
  59. GUICtrlCreateButton($name0, 30, 45, 160, 35, $BS_CENTER)
  60. $var0 = GUICtrlCreateButton("", 70, 85, 80, 30)

  61. GUISetState(@SW_SHOW)


  62. $auto = Run(_auto())

  63. While 1

  64.         $nMsg = GUIGetMsg()
  65.         Switch $nMsg
  66.                 Case $GUI_EVENT_CLOSE

  67.                         Quit()

  68.                 Case $Button1
  69.                        
  70.                         _Label0()
  71.                        

  72.                 Case $Button2
  73.                         Quit()

  74.         EndSwitch

  75. WEnd

  76. Func _auto()

  77.         _Label0()
  78.        
  79.        
  80.         _timer1()
  81.         _auto0()
  82.        
  83. EndFunc   ;==>_auto

  84. Func _Label0()

  85.         $0 = Ping($0_add, 4000)
  86.         If $0 Then
  87.                 GUICtrlSetData($var0, $0 & "毫秒")
  88.                 GUICtrlSetBkColor($var0, 0x9AFF9A)
  89.                 GUICtrlSetColor($var0, 0x000000)
  90.                 IniWrite(@ScriptDir & "\Screening0.ini", "Screening", "Screening0", "0")
  91.         Else
  92.                 GUICtrlSetData($var0, "超时")
  93.                 GUICtrlSetBkColor($var0, 0xFF3030)
  94.                 GUICtrlSetColor($var0, 0x000000)
  95.                 IniWrite(@ScriptDir & "\Screening0.ini", "Screening", "Screening0", "1")
  96.                
  97.         EndIf
  98. EndFunc   ;==>_Label0

  99. Func _Timer()

  100.         GUICtrlSetData($BT, @YEAR & "年" & @MON & "月" & @MDAY & "日(" & $WK[@WDAY] & ")" & @LF & "      " & @HOUR & ":" & @MIN & ":" & @SEC)
  101.        
  102. EndFunc   ;==>_Timer

  103. Func _auto0()
  104.         Sleep(6000)
  105.         _auto()
  106. EndFunc   ;==>_auto0

  107. Func _timer1()
  108.         AdlibRegister("_Alarm()", 20000)
  109. EndFunc   ;==>_timer1

  110. Func _Alarm()

  111.         If (IniRead(@ScriptDir & "\Screening0.ini", "Screening", "Screening0", "") = "1") Then
  112.                
  113.                 _SoundPlay($Alarm, 0)


  114.         EndIf
  115. EndFunc   ;==>_Alarm


  116. Func Quit()
  117.         Exit
  118. EndFunc   ;==>Quit
复制代码
发表于 2018-2-7 16:00:44 | 显示全部楼层
Sleep(6000)看你怎么点

不知道是不是这样,没懂意思!
#NoTrayIcon
#RequireAdmin
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#PRE_Icon=1.ico
#PRE_Outfile=网络监控程序).exe
#PRE_Compression=4
#PRE_UseX64=n
#PRE_Res_Description=网络监控程序
#PRE_Res_Fileversion=1
#PRE_Res_ProductVersion=
#PRE_Res_LegalCopyright=
#PRE_Res_requestedExecutionLevel=None
#PRE_Res_Field=ProductName|网络监控程序
#PRE_Run_AU3Check=N
#PRE_Run_Tidy=Y
#Tidy_Parameters=/sci 1
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****

#include <Array.au3>
#include <Access.au3>
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <EditConstants.au3>
#include <FileConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiTab.au3>
#include <GuiEdit.au3>
#include <GuiListView.au3>
#include <IE.au3>
#include <ListViewConstants.au3>
#include <MsgBoxConstants.au3>
#include <Misc.au3>
#include <process.au3>
#include <Sound.au3>
#include <string.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <TrayConstants.au3>
#include <WinAPIFiles.au3>
#include <WindowsConstants.au3>

Opt("MustDeclareVars", 1)
_WinAPI_Wow64EnableWow64FsRedirection(False)
ProcessSetPriority(@AutoItPID, 3)

Local $form1, $auto, $BT, $Button1, $Button2, $font, $WK, $name0, $var0, $0, $0_add, $nMsg

Dim $WK[8] = [8, "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]

$form1 = GUICreate("网络监控程序", 400, 300)
$font = "Comic Sans MS"

$BT = GUICtrlCreateLabel(@YEAR & "年" & @MON & "月" & @MDAY & "日(" & $WK[@WDAY] & ")" & @LF & "      " & @HOUR & ":" & @MIN & ":" & @SEC, 105, 5, 180, 25)
GUICtrlSetColor($BT, 0xff0033)
AdlibRegister("_Timer", 1000)

Local $Alarm = @ScriptDir & "\Alarm.wav"

$name0 = IniRead(@ScriptDir & "\config.ini", "server", "name0", "")
$0_add = IniRead(@ScriptDir & "\config.ini", "server", "server0", "")
$Button1 = GUICtrlCreateButton("刷新", 150, 200)
$Button2 = GUICtrlCreateButton("退出", 250, 200)
GUICtrlCreateButton($name0, 30, 45, 160, 35, $BS_CENTER)
$var0 = GUICtrlCreateButton("", 70, 85, 80, 30)

GUISetState(@SW_SHOW)


_Label0()
_timer1()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Quit()

                Case $Button1
                        _Label0()

                Case $Button2
                        Quit()

        EndSwitch

WEnd

Func _Label0()
        $0 = Ping($0_add, 4000)
        If $0 Then
                GUICtrlSetData($var0, $0 & "毫秒")
                GUICtrlSetBkColor($var0, 0x9AFF9A)
                GUICtrlSetColor($var0, 0x000000)
                IniWrite(@ScriptDir & "\Screening0.ini", "Screening", "Screening0", "0")
        Else
                GUICtrlSetData($var0, "超时")
                GUICtrlSetBkColor($var0, 0xFF3030)
                GUICtrlSetColor($var0, 0x000000)
                IniWrite(@ScriptDir & "\Screening0.ini", "Screening", "Screening0", "1")
        EndIf
EndFunc   ;==>_Label0

Func _Timer()
        GUICtrlSetData($BT, @YEAR & "年" & @MON & "月" & @MDAY & "日(" & $WK[@WDAY] & ")" & @LF & "      " & @HOUR & ":" & @MIN & ":" & @SEC)
EndFunc   ;==>_Timer

Func _timer1()
        AdlibRegister("_Alarm()", 20000)
EndFunc   ;==>_timer1

Func _Alarm()
        _Label0()
        If (IniRead(@ScriptDir & "\Screening0.ini", "Screening", "Screening0", "") = "1") Then
                _SoundPlay($Alarm, 0)
        EndIf
EndFunc   ;==>_Alarm

Func Quit()
        Exit
EndFunc   ;==>Quit
 楼主| 发表于 2018-2-7 16:40:16 | 显示全部楼层
回复 2# xzf680


    谢谢,但是我的意思是ping循环和 Alarm 循环是两个独立的,就是说Alrm是独立定时循环检测,PING也是独立执行的,请问有办法操作吗?
发表于 2018-2-7 16:52:28 | 显示全部楼层
回复 3# heheghostxp [/
   
PING 跟 Alarm  有甚麼不一樣??

全部 用 AdlibRegister  這個來做 不就好了嗎??
 楼主| 发表于 2018-2-7 17:04:50 | 显示全部楼层
本帖最后由 heheghostxp 于 2018-2-7 17:14 编辑

回复 4# kk_lee69
比如说 我需要5分钟PING 一次,但是我的Alrm需要定时30秒一次,这样可以弥补刚刚发出报警的时后我没有电脑前的提示。我可以很快知道有报警,而不是它5分钟以后,再次PING 的时候发出报警我才知道。我这样说你们是否清楚?而且使用多个AdlibRegister 会造成主流程窗口时间和报警时间停止,只有定时ping在执行。不知道有什么方法可以代替SLEEP ?按照我的方法只是刷新和退出无法执行,其他功能正常,想退出只有结束进程才能完成,刷新也无法使用是因为主流程占用了,如果使用AdlibRegister 会造成主流程窗口时间和报警定时时间停止。
发表于 2018-2-7 17:35:43 | 显示全部楼层
回复 5# heheghostxp

你怎麼計算5分鐘??   你的邏輯是有問題的  不會有人拿 SLEEP 當作計時工具

每五分鐘 應該採取 AdlibRegister 才對....

且 AdlibRegister 是最不影響 程式的
发表于 2018-2-7 17:41:46 | 显示全部楼层
本帖最后由 kk_lee69 于 2018-2-7 17:47 编辑

回复 5# heheghostxp

你可不可以縮小你的 模型  用 ConsoleWrite("執行PING") 與 ConsoleWrite("執行 Alarm")  代替你要做的事情

寫出 你 目前的架構為何??

或者 能否寫出你的架構 用一個 不需要 外加任何檔案 就可以執行正常的

方便測試
发表于 2018-2-7 18:02:57 | 显示全部楼层
回复 5# heheghostxp

  1. #include <GDIPlus.au3>
  2. #include <GUIConstantsEx.au3>
  3. #include <GuiListView.au3>

  4. #include <GUIComboBox.au3>

  5. #include <Constants.au3>
  6. #include <GuiImageList.au3>
  7. #include <WindowsConstants.au3>
  8. #include <EditConstants.au3>
  9. #include <FontConstants.au3>
  10. #include <GuiEdit.au3>




  11. Opt("GUIOnEventMode", 1)
  12. $WinMain = GuiCreate("",800,600,-1,-1, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_SYSMENU, $WS_GROUP, $WS_TABSTOP))

  13. $B1 = GuiCtrlCreateButton('B1', 290, 58, 80, 25); 清除紀錄按鈕
  14. $B2 = GuiCtrlCreateButton('B2', 290, 88, 80, 25); 清除紀錄按鈕

  15. AdlibRegister("A_PING", 1000)
  16. AdlibRegister("A_Alarm", 500)

  17. GUICtrlSetOnEvent($B1, "GUI_COMMAND")
  18. GUICtrlSetOnEvent($B2, "GUI_COMMAND")
  19. GUISetOnEvent($GUI_EVENT_CLOSE,"GUI_COMMAND")
  20. GUISetState()

  21. While 1

  22. Sleep(20)

  23. WEnd

  24. GUIDelete()


  25. Func GUI_COMMAND()
  26.     Switch @GUI_CtrlId
  27.         Case $GUI_EVENT_CLOSE
  28.             Switch @GUI_WINHANDLE
  29.                                 Case $WinMain
  30.                                         ;DllCallbackFree($wProcNew)
  31.                     Exit

  32.                 Case $WinSub
  33.                     GUIDelete(@GUI_WINHANDLE)
  34.                                         ;GUICtrlSendMsg($hTab, 4912, 0, 0)
  35.                                         GuiSetState(@SW_ENABLE,$WinMain) ; 使窗口重新可用

  36.                 Case Else
  37.                  ;   GUIDelete(@GUI_WINHANDLE)
  38.        
  39.                                        
  40.                                        
  41.                   
  42.             EndSwitch




  43.                 Case $B1
  44.                        
  45.                        
  46.                 Case $B2
  47.                        
  48.                        
  49.         EndSwitch
  50. EndFunc


  51. Func A_PING()
  52.         ConsoleWrite("執行PING"&@CRLF)
  53. EndFunc


  54. Func A_Alarm()
  55.         ConsoleWrite("執行Alarm"&@CRLF)
  56. EndFunc



复制代码
這樣不就可以 無限循環跟退出
发表于 2018-2-7 18:39:35 | 显示全部楼层
sleep 时间过长,过频,
或是执行的工作耗时长,
那还是老实点玩多进程吧.
发表于 2018-2-7 18:39:40 | 显示全部楼层
sleep 时间过长,过频,
或是执行的工作耗时长,
那还是老实点玩多进程吧.
 楼主| 发表于 2018-2-8 11:53:18 | 显示全部楼层
回复 8# kk_lee69


    这样还会时间停止,如报警超过5个以上就会停止,低于5个就会好一些。估计是PING的时候造成PING线程阻塞导致的,网络立即ping通就会恢复计时。
发表于 2018-2-8 12:00:42 | 显示全部楼层
回复 11# heheghostxp


    我的範例有停止嗎??
发表于 2018-2-8 12:03:05 | 显示全部楼层
回复 11# heheghostxp


    估计是PING的时候造成PING线程阻塞导致的,网络立即ping通就会恢复计时  

這是寫法問題..........你可以在 PING 的時候  先取消 AdlibRegister  PING 完畢後再 重新註冊 AdlibRegister
 楼主| 发表于 2018-2-8 20:20:14 | 显示全部楼层
回复 13# kk_lee69


    你的范例和先取消再注册都不行,还是时间停止
 楼主| 发表于 2018-2-8 21:38:14 | 显示全部楼层
回复 13# kk_lee69


    唯独用SLEEP执行循环ping不会停止时间,但不能刷新和关闭软件,只有关闭进程才行
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2018-10-17 13:29 , Processed in 0.106282 second(s), 15 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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