autohotkey:如何设置看门狗

时间:2014-05-23 19:21:15

标签: autohotkey

我的AHK脚本的预期运行时间介于5分钟到25分钟之间,具体取决于事件。它主要是通过屏幕抓取浏览器,搜索模式并采取相应的操作(通过单击屏幕上的某些区域)。完成所有操作后终止浏览器会话。我安排它从Windows任务调度程序每小时运行一次。

我的问题是,当出现网络问题或我的工作站CPU处于高级时刻时,网页加载的时间不足(通常大约15秒,并且不可能使其更长因为内容可能在30秒内发生变化)或者在过程中间可能会挂起一些东西。

如果发生这样的事情,我希望AHK脚本退出并在退出之前,我希望它终止所有浏览器会话(在这种情况下为chrome)

到目前为止,我无法提出一个单一的脚本"解。

我目前的状态是启动一个脚本,每30分钟监控一次文件的内容,如果内容没有从上次更改,请打开一个新的Google Chrome会话并发送 Shift - Ctrl - Q 用于关闭所有chrome实例的键序列。同时,我的主脚本在完成后使用与之前的值不同的数字更新相同的文件,并且它是唯一的。这种方法的不足之处:我不知道如何在不杀死这个看门狗脚本的情况下杀死其他AHK脚本(挂一个)。

我的最终愿望是将这个功能构建到主脚本中,这个脚本容易被挂起。

我的主要脚本

send #r
send chrome.exe http://myURL{enter}
mousemove 200,200
send ^a
send ^c

;
; using a series of IfInString commands
; determine the condition
; then use mousemove, x, y and mouseclick, l
; commands, do my deed 

filedelete, c:\mydir\myfile
fileappend, newnumber, c:\mydir\myfile
exitapp

我的看门狗脚本

loop   ; forever
{
; old content is stored in variable PREV
fileread, newval, c:\mydir\myfile
if (newval = PREV)
{
  send #r
  send chrome.exe
  sleep 10000 ; wait for chrome window to pop up 
  send ^+Q
  ; I need a way to stop my hung AHK script here but don't know how
}
else
{
  PREV = %newval%
  sleep 1800000 ; sleep 30 minutes
}
} ; end of loop
f10::exitapp ; when I need to stop watchdog

当然这些不是实际的脚本。只是为了给你一个主意。否则,有很多等待页面加载等等。但它的要点就在那里。

提前感谢您的帮助

2 个答案:

答案 0 :(得分:0)

  • 我提供了一些AutoHotkey代码块,可以解决您描述的问题。
  • 我会尝试写两个脚本,这样如果两个脚本都被终止了, 有可能做一些检查并恢复,好像什么都没有 已经发生了,即增加了灵活性。
  • 我个人几乎从不使用SetTimer,我只使用Sleep的循环, 在这种情况下,我认为这不会有助于改进脚本。
  • 我发现对于已经挂起的脚本,但是对于没有错误消息的地方说明它们已经终止, 您可以检索hWnd(窗口句柄)和PID(进程ID),从而终止它们。
  • 使用UrlDownloadToFile可以更轻松地完成您描述的某些任务 或WinHttpRequest(参见论坛上的示例)下载网页,然后解析html。
  • 使用带有COM(组件对象模型)的Internet Explorer可以更轻松地完成其他任务, 查询/操纵实时网页中的网页元素。

-

;to launch Chrome and wait for it to open (with an optional delay afterwards)
;if the window is not seen within 60 seconds, ErrorLevel is set to 1 and action can be taken
Run, "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "https://www.google.com/"
WinWaitActive, ahk_class Chrome_WidgetWin_1, , 60
if ErrorLevel
{
MsgBox error ;put code here
}
else
{
Sleep 10000
;put code here
}

;to launch Internet Explorer and wait for it to open (with an optional delay afterwards)
Run, "C:\Program Files\Internet Explorer\iexplore.exe" "https://www.google.com/"
WinWaitActive, ahk_class IEFrame
Sleep 10000

;to terminate a script
DetectHiddenWindows, On
vPathScript = %A_ScriptDir%\my script.ahk
WinGet, hWnd, ID, %vPathScript% - AutoHotkey v ahk_class AutoHotkey
IfWinExist, ahk_id %hWnd%
{
WinGet, vPID, PID, ahk_id %hWnd%
Process, Close, %vPID%
}

答案 1 :(得分:0)

使用以下方法处理看门狗:     -2台带有共享文件夹的本地PC     -3个ahk脚本

PC-1 ahk处理脚本(永远循环)    Windows启动时自动启动

LOOP   
   put a WD file on PC-2
   run some process
   wait some time 
   go to LOOP

PC-1 ahk WD-1脚本     Windows启动时自动启动(永远循环)

    if initial startup set Counter and put WD file in local shared folder
LOOP 
    wait some time
    if local WD file doesn't exist decrement Counter
    if Counter = Zero Send Email
    if local WD file exists reset Counter and delete local WD file
    go to LOOP

PC-2 ahk WD-2脚本     Windows启动时自动启动(永远循环)

    if initial startup set Counter and put WD file in local shared folder
LOOP 
    wait some time
    if local WD file doesn't exist decrement Counter
    if Counter = Zero Send Email
    if local WD file exists reset Counter and delete local WD File
    put WD file on PC-1 
    go to loop

基本故障方案:

Process script Fails ... PC-1 and PC-2 WD scripts will send emails     
PC-1 Fails ... PC-2 WD script will send email
PC-2 Fails ... PC-1 WD script will send email