我最近写了一个名为WindowTiler的实用程序,它使用全局快捷方式在当前聚焦的窗口中移动。我通过AppleScript在窗口中移动,并使用以下脚本获取聚焦窗口的边界:

tell application "System Events"
  set appName to the first process whose frontmost is true
  set appWindow to the value of attribute "AXFocusedWindow" of appName
  set {w, h} to the size of appWindow
  set {x, y} to the position of appWindow
  set appBounds to {x, y, x + w, y + h}
end tell
{bounds:appBounds}

随着时间的流逝,我意识到我的应用程序如果不使用
,其响应速度会很慢。在密集测量时间性能之后,我发现所显示的AppleScript的第二行是导致响应缓慢的原因。有时,脚本需要一整秒才能执行(据我所知,在SSD上,HDD甚至更糟)。

我不知道为什么AppleScript需要这么长时间才能简单地查找最前端的流程-应该是对流程管理器的唯一请求。也许您知道为什么它这么慢和/或可以告诉我一种使脚本更快的方法。

PS:创建我的应用程序(“存档”)时,我将Xcode配置为预编译AppleScript。编译的脚本是只读的。

最佳答案

在接收基于Carbon的事件热键时,我还没有看到这种滞后。您是否已将日志记录添加到代码中以查看何时调用热键回调?这实际上需要花费几秒钟,还是您可能需要花费几秒钟来处理它?

请看DDHotKey,以了解如何做得更好的示例(或者您可能只想使用Dave's代码代替您的代码)。

编辑

如果程序运行一段时间后遇到麻烦,则可能还需要通过Instruments运行它。确保您没有泄漏大量的内存或线程。这可能会给您您描述的症状。

EDIT2

为什么不加载脚本并将其保存在ivar或static中,而不是按需加载?即使进行了编译,您仍然必须从磁盘上读取它,对其进行解析并建立数据结构。 (此外,该问题已脱离主题。您应该将其关闭,并开始一个有关Applescript性能的新问题。否则,它将使以后寻找答案的人们感到困惑。)

关于process - 为什么通过AppleScript检索最前端的过程需要这么长时间?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6883667/

10-13 06:10