2017-09-15 37 views
0

在下面的腳本中,我嘗試運行一系列命令。但是當按F1運行時,命令將立即在兩個對方之後運行兩個SendAndLoopFor()調用,而無需等待內部循環完成。如何等待函數完成時使用內部循環

我試圖通過在函數內添加一個return「」來強制這個等待,並用它來分配一個變量Foo := SendAndLoopFor(),但即使那樣它也不會等待操作。

有沒有辦法在執行下一個命令之前等待SendAndLoopFor()命令的完成?

#NoEnv 
SendMode Input 
SetWorkingDir %A_ScriptDir% 
#MaxThreadsPerHotkey 13 
#SingleInstance 
F1:: 
Done = 0 
Toggle := !Toggle 
Loop 
{ 
    If (!Toggle) 
     Break 
    SendAndLoopFor("4", -13600) 
    SendAndLoopFor("5", -13600) 
} 
return 

SendAndLoopFor(TSend="", Timeout=0) 
{ 
    Send %TSend% 
    SetTimer, LoopLimit, %Timeout% 
    Loop 
    { 
     If(!Toggle) 
      Break 
     If(done == 1) 
     { 
      done = 0 
      Break 
     } 
     MouseClick, left 
     sleep 83 
    } 
} 
LoopLimit: 
    Done = 1 
Return 
+0

您需要SendAndLoopF​​or之前返回()。而你指的是一個不存在的標籤,名爲LoopLimit –

+0

啊,我確實忘了包括那件。稍後編輯它 –

+0

AutoHotkey會按順序運行它們,但是您的'SendAndLoopF​​or'循環只有83毫秒的「睡眠」時間。這是故意的嗎?因爲你目前的延遲幾乎感覺不到。 –

回答

0

您的問題似乎從SetTimer的的誤解造成的。這是並行化任務的極好工具,因爲在繼續執行腳本之前,腳本固有地不會等待計時器。

爲了說明這一點,簡化腳本並觀察相同的效果。

F3:: 
SetTimer, LoopLimit, -2000 
SendInput, This is stuff happening before the timer.{Enter} 
return 

LoopLimit: 
SendInput, This is stuff happening after. 

一個簡單的解決方案是計數迭代次數和命中計數器限制後殺死循環。

F3:: 
count = 0 

Loop 
{ 
; Do stuff. 

count += 1 
Sleep, 1000 

if (count >= 5) 
{ 
break 
}} 

您還可以使用various built-in variables比較從循環的開始時間,以你的臨界值,但這些都可以一起工作很煩,所以我建議避免它們,除非你的腳本時間內工作敏感的約束。按照意見

編輯:

F1:: 
Done = 0 
Toggle := !Toggle 
Loop 
{ 
    If (!Toggle) 
     Break 
    SendAndLoopFor("4", -13600) 
    SendAndLoopFor("5", -13600) 
    Sleep, 2000 
} 
return 

SendAndLoopFor(TSend="", Timeout=0) 
{ 
    Send %TSend% 
    SetTimer, LoopLimit, %Timeout% 
    Loop 
    { 
     If(!Toggle) 
     { 
      SendInput, This is inside the Toggle.{Enter} 
      Break 
     } 
     If(done == 1) 
     { 
      SendInput, This is inside the Done.{Enter} 
      done = 0 
      Break 
     } 
     SendInput, This is after the If statements.{Enter} 
     MouseClick, left 
     Sleep, 999999 ; Note how this has no effect due to above break. 
    } 
} 
LoopLimit: 
    Done = 1 
+0

這不是循環部分,但我有一個問題。它是函數調用的鏈。 'SendAndLoopF​​or(「4」,-13600)',它內部循環它的'點擊'命令,因爲它應該。但同時另一個'SendAndLoopF​​or(「5」,-13600)'也被調用。無需等待第一次調用完成。 –

+0

@MXD我不假設你有機會測試循環中的每個條件語句嗎? SendAndLoopF​​or'內部的'If(!Toggle)'總是爲真,因此循環總是中斷。因爲你沒有睡眠命令,延遲時間足夠長,所以它們似乎在同一時間觸發,但情況並非如此。他們只是快速完成。我將修改你的代碼來編輯我的答案以展示這一點。 –

+0

有效地,我以相同的方式在另一個腳本中使用If(!Toggle)。它的工作原理很好。 https://gist.github.com/anonymous/36e75336eec880016bc6aef81861edcf(完整腳本)我上面的代碼示例使用了完全相同的代碼,但將複製粘貼代碼提取到函數中,使代碼更乾燥。同樣,如果'Toggle語句永遠是真的,它不會開始運行。考慮到它也在第一個循環中,一個調用這些命令。 –

相關問題