首页 > 解决方案 > 如何正确防止我的 AutoHotKey 脚本的多个实例同时运行?

问题描述

在过去几周阅读手册、搜索和故障排除后,我制作了这个 AutoHotKey 脚本:

#Persistent
#SingleInstance force

if A_Args[1] > 0
{
    Menu, Tray, Icon, C:\blablabla\new notifications.png
}
else
{
    Menu, Tray, Icon, C:\blablabla\no new notifications.png
}

这个,我编译成test.exe. 然后我从终端这样称呼它:test.exe 1, test.exe 0, test.exe 2, test.exe 3, 等等。

如果我慢慢/手动执行它,它会起作用:它只保留一个脚本实例,在通知区域中直观地显示为一个漂亮的小图标(如预期的那样),从不启动多个实例。

但是,当我开始实际使用它时,通过从我的脚本中调用相同的终端命令,它通常会打开两个或多个实例,这些实例保持打开状态,只会使通知区域越来越长,而忽略了它只能作为一个实例运行。

我能够通过在每次这样的命令调用之后在我的脚本中引入一个短暂的“睡眠”来“解决”它,这样同一个脚本就不会连续太快地调用它。然而,今天,我意识到我的多个不同脚本经常同时调用它,或者几乎同时调用它。这意味着我的“聪明”睡眠解决方案达不到要求。

然后我想我可以使用数据库来跟踪上次脚本调用这个的时间,如果太快就不要这样做,但如果我这样做了,整点就会丢失,因为我不能再相信该图标可以准确地告诉我系统中是否有新通知。我一直想知道是否存在这样的“竞争条件”,并且无论如何都要手动去检查,这违背了这个视觉指示的意义,它应该让我总是“一目了然”知道是否有新的通知在我的系统中。

也许我可以在我的脚本中有一个循环并在它检测到最近发送通知时反复重试,但这意味着我的脚本可能会停止很长时间,因为它们都发送通知(尤其是在早上,当我醒来并启动我的系统)。这似乎是错误的解决方案。

真的没有办法在脚本本身中正确处理这个吗?从我的描述中可以明显看出,#Persistent#SingleInstance force规则没有得到尊重。

(过去我也遇到过类似的问题,程序无法“处理”运行命令太快,除了引入睡眠之外,我不知道该怎么做。但即便如此,它也经常出现故障。例如,Notepad++要求我先打开一个文档,然后用指定的行号再次打开它,中间休眠,否则它不会转到指定的行。)

标签: windows-10autohotkey

解决方案


推荐阅读