通过热键暂停While循环 [英] Pause While loop by hotkey
问题描述
我想暂停一个包含While
循环和某些功能的AutoIt脚本.但是我只能关闭HotKeySet()
上的脚本.我该如何暂停?
I want to pause an AutoIt script containing a While
loop and some functions. But I am only able to close the script on HotKeySet()
. How can I pause it?
该脚本在屏幕的一部分上检查更改(x,y坐标在配置文件中设置),并在播放警报声音后拍摄屏幕截图.按下暂停按钮时,它不会停止While
循环.但是关闭程序是可行的.这是我的代码:
The script checks for changes on a part of screen (x,y coordinates are set in a config file) and takes screenshots after playing an alert sound. It doesn't stop the While
loop when pushing the pause button. But closing the program works. Here is my code:
Global $Paused, $counter = 0
HotKeySet("{1}", "TogglePause")
HotKeySet("{2}", "Terminate")
HotKeySet("{3}", "ShowMessage")
Init()
Start()
While 1
$counter +=1
ToolTip('Script is "Running"',0,0, $counter, 1)
Sleep(700)
Switch TrayGetMsg()
Case $resume
Start()
DisableAlert()
Case $exit
ExitLoop
Exit
EndSwitch
WEnd
//some of the functions
Func Start()
$ready = 0
$count = 0
$lastScreenshotNum = 0
TrayItemSetState($resume, $TRAY_DISABLE)
TraySetIcon("on.ico")
TakeScreenshot()
AdlibRegister(TakeScreenshot,2000)
EndFunc
Func Stop()
AdlibUnRegister(TakeScreenshot)
TraySetIcon("off.ico")
TrayItemSetState($resume, $TRAY_ENABLE)
EndFunc
Func TogglePause()
Stop()
$Paused = NOT $Paused
While $Paused
sleep(100)
ToolTip('Script is "Paused"',0,0, $counter, 1)
WEnd
ToolTip("")
EndFunc
Func Terminate()
Exit 0
EndFunc
Func ShowMessage()
MsgBox(4096,"","This is a message.")
EndFunc
Func EnableAlert()
SendMail()
Alert()
AdlibRegister(Alert,5000)
EndFunc
Func DisableAlert()
AdlibUnRegister(Alert)
EndFunc
Func Alert()
SoundPlay("alert.mp3")
EndFunc
推荐答案
我想暂停一个包含while1循环和一些功能的Autoit脚本.但是我只能关闭HotKeySet上的脚本.那我该如何暂停呢?
I want to pause an Autoit script, containing a while1 loop and some functions. But I am only able to close the the script on HotKeySet. So how can i pause it?
暂停" While
-通过运行以(键切换)状态(未测试,无错误检查)为条件的指令进行循环:
"Pause" While
-loops by running their instructions conditional to (key-toggled) states (untested, no error checking):
Global Const $g_sKeyQuit = 'q'
Global Const $g_sKeyPause = 'p'
Global Const $g_iDelay = 500
Global $g_bStateQuit = False
Global $g_bStatePause = False
Main()
Func Main()
HotKeySet($g_sKeyQuit, 'SwitchStateQuit')
HotKeySet($g_sKeyPause, 'SwitchStatePause')
While Not $g_bStateQuit
If Not $g_bStatePause Then YourCode()
Sleep($g_iDelay)
WEnd
Exit
EndFunc
Func YourCode()
Local Static $iCount = 0
$iCount += 1
ConsoleWrite($iCount & @LF)
EndFunc
Func SwitchStateQuit()
$g_bStateQuit = True
EndFunc
Func SwitchStatePause()
_SwitchVar($g_sKeyPause)
EndFunc
Func _SwitchVar(ByRef $bSwitch)
$bSwitch = Not $bSwitch
EndFunc
- P 暂停.
- Q 退出.
- 根据需要更改
YourCode()
的内容. - P pauses.
- Q exits.
- Change content of
YourCode()
as required. - 循环和
AdlibRegister()
是完成相同操作的不同方法(选择其中一个). - 如果准确地使用
TimerDiff()
需要em>定时重复,因为简单地添加Sleep()
会引入时间漂移(忽略执行时间,对于AdlibRegister()
也是这样).根据文档: - Loops and
AdlibRegister()
are different ways to accomplish the same (choose either one). - Use
TimerDiff()
if accurately timed repetition is required because simply addingSleep()
introduces time-drifts (disregards execution time, which is true forAdlibRegister()
as well). As per documentation:
视觉说明(在Main()
中说明While
-loop):
Visual explanation (illustrating While
-loop in Main()
):
请注意,其他正在运行的进程通常会影响计时准确性,因此暂停的持续时间可能会比请求的时间稍长.
Note that other running processes often affect the timing accuracy and so pauses are likely to last for slightly longer than requested.
这篇关于通过热键暂停While循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!