微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决authotkey:停止/结束当前包含多个块的热键线程

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

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

解决方法

在 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()  
}

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

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

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

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


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

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

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

为了学习 AHK-v2 本身,这里有一个帮助您入门的文档页面:
here
AHK-v2刚刚从alpha阶段出来,现在处于beta阶段。

,

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

your_hotkey::
reload

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。