autohotkey:停止/结束包含多个块的当前热键线程

Posted

技术标签:

【中文标题】autohotkey:停止/结束包含多个块的当前热键线程【英文标题】:authotkey: stopping/ending current hotkey thread containing multiple blocks 【发布时间】:2021-10-01 21:46:58 【问题描述】:
3::
;code with sleep timers here
loop 5
;code with sleep timers here

;code with sleep timers here

我有一个类似上面的热键设置。我希望能够在它运行时停止它,理想情况下使用任何 wasd 按键,不太理想的是再次按下相同的键 (3)。我读过的所有文档都依赖于使用 BREAK ......这只会打破直接循环。在第二个循环中折腾整个代码并中断不起作用:

#MaxThreadsPerHotkey 2
3::
Toggle := !Toggle
loop, 1
;code
loop 5
If not Toggle
        break
;code

    If not Toggle
        break

return

我尝试暂停而不是中断,但我不希望保存当前线程,我希望它重置。我尝试了 SUSPEND,但它只会停止未来的热键......它会完成当前正在运行的热键。我用#persistent 尝试了EXIT,但它也没有按预期工作。同样,我想要的是正在运行的当前热键停止并重置,就好像它正常结束一样......而不影响我的其他热键。

【问题讨论】:

【参考方案1】:

在 AHK 中没有一个很好的方法(我知道)(至少没有一些非常深奥的魔法) 但它是微不足道的在AHK_H。

什么是 AHK_H?

AutoHotkey_H 为原始 AutoHotkey 添加了功能,并使用 NewThread() 函数(仅限 v2)和 AutoHotkey.dll 提供真正的多线程。

现在我不会推荐或反对您学习/使用 AHK_H,我只是将其作为一个选项来介绍。 另外我要写 AHK-v2,因为我真的看不出写 AHK_H-v1 有什么意义,而且与 H-v2 相比,H-v1 也缺少一些功能。

因此,在 AHK_H(v2) 中,您可以执行以下操作:

script1 := "
(
ToolTip("Hi from Thread1, step1")
Sleep(1000)
Loop 5

    ToolTip("Hi from Thread1, loop" A_Index)
    Sleep(1500)

ToolTip("Hi from Thread1, step2")
Sleep(5000)
ToolTip("Bye from Thread1, the end")
Sleep(1000)
)"

script2 := "
(
ToolTip("Hi from Thread2, step1")
Sleep(2000)
Loop 5

    ToolTip("Hi from Thread2, loop" A_Index)
    Sleep(1750)

ToolTip("Hi from Thread2, step2")
Sleep(3000)
ToolTip("Bye from Thread2, the end")
Sleep(1000)
)"


1::

    global script1, Thread1
    if (IsSet(Thread1))
        Thread1.ahkterminate()
    Thread1 := AhkThread(script1)


^1::

    global Thread1
    if (IsSet(Thread1))
        Thread1.ahkterminate()  



2::

    global script2, Thread2
    if (IsSet(Thread2))
        Thread2.ahkterminate()
    Thread2 := AhkThread(script2)


^2::

    global Thread2
    if (IsSet(Thread2))
        Thread2.ahkterminate()  

首先,我们为变量 script1script2 定义两个单独的 AHK 脚本,就像纯文本字符串一样。 为此使用了续行部分(docs)

然后定义热键1::。 在这里,我们首先说我们正在使用该热键范围之外的变量 script1Thread1(docs1)(docs2),就像您需要的那样在 AHK-v1 中做函数。在 v2 中,您也需要为热键执行此操作。 然后我们检查变量Thread1是否已经被设置(docs),我们想在再次使用ahkThread(docs)运行它之前终止它(除非您希望能够同时运行多个相同的脚本)。

然后定义热键^1::。 在这里,我们可以随时通过按 Ctrl+1 来终止 thread1。

然后对 2 号进行完全相同的操作。


当然,这是一个非常简单的示例,其中不需要线程之间的通信或任何更特殊的通信。当然,所有这些也是非常可行的。

要运行您的 AHK_H-v2 脚本,请下载 AHK_H-v2 here,然后通过文件夹 x64w 中的 AHK 解释器运行您的 .ahk 文件。 (如何?例如,只需将您的.ahk 文件拖放到AutoHotkey.exe 上)

要阅读 AHK_H 文档,我推荐下载随附的 .chm 文件。 它往往比在线文档更好/更新。

为了学习 AHK-v2 本身,这里有一个帮助您入门的文档页面:https://lexikos.github.io/v2/docs/v2-changes.htm AHK-v2 刚刚从 alpha 阶段出来,现在处于 beta 阶段。

【讨论】:

【参考方案2】:

您可以使用不同的热键并重新加载脚本。

your_hotkey::
reload

如果您当前的代码是这样工作的,或者直接使用reload 而不是break

【讨论】:

以上是关于autohotkey:停止/结束包含多个块的当前热键线程的主要内容,如果未能解决你的问题,请参考以下文章

停止调试会话后,有没有办法强制上次热重载的更改持续存在?

Autohotkey 和 Windows 10:如何获取当前资源管理器路径

Autohotkey输入无需端键

如何在 AutoHotkey 中等待两个或多个不同的窗口

Autohotkey 同时多个热键(中键、左键、鼠标右键同时按下)

跨多个包含块的 Java 变量 - 无法解析变量