1

我想同时启动两个程序。

  • 一个有一个图表,显示预期的实际输出线(执行后它显示另一条输出线)。
  • 另一个有一些应用。第二个程序必须在第一个程序(带图表)的同时启动。

但是两个程序启动之间存在不必要的延迟(微秒)。有没有办法加快 AutoIt 的执行速度?

4

1 回答 1

4

简短的回答:没有。

更长的解释:一台计算机永远不能同时执行两个程序。甚至多任务也只是在程序之间快速切换,似乎有同时运行的效果,但实际上它们是按顺序工作的,而不是并行工作的。即使有多个处理器内核,您也会让 os 调度程序在一个内核上运行,因此您可以通过大量的编程工作和计时器事件使其在一个专用内核上运行两个进程,每个进程在同一时钟上执行给定的类似入口点时间。但这对您没有多大帮助,因为您的输出仍将由单个显卡和单个主板处理,每个内核共享相同的中断......所以对于您的具体问题,这是不可能的。

将来您实际上可以尝试使用AdlibRegister来运行指定的函数……但它也会暂停主脚本的执行…… AutoIt 无法同时运行多个函数。据我了解,它甚至不是为此而设计的,因为它是一种解释性脚本语言。

您可以使用另一种能够线程化的语言来执行您想要的操作。

无论如何,您的Run(...)函数不会等待执行终止RunWait。所以两次调用之间的差距Run应该很小。话虽如此,一个需要进一步讨论的问题可能是:在没有 AutoIt 帮助的情况下,您究竟想实现什么以及如何实现您的目标?因为您的点击速度很可能不如您对某些功能的调用快......您可以问另一个更具体的问题。但是请提供一些示例代码;-)

并且使用这个简单的示例代码,您实际上可以证明即使使用两次Run调用,您也不能确定程序实际上会按照给定的顺序出现。至少在我的电脑(Win7 64Bit,Quad Core i5 3.1GHz,4GB RAM)上,这些行会产生一些输出,其中第二个运行调用的窗口出现在第一个运行调用的窗口之前......大约 5-15% 的时间.

Opt("WinTitleMatchMode", 2)
For $i = 1 To 50
   $pid1 = Run("notepad")
   $pid2 = Run("notepad")

   $firstWin = WinWait("Notepad")
   $winProcess = WinGetProcess($firstWin)

   If $winProcess == $pid2 Then ConsoleWrite($pid1 & ", " & $pid2 & "; " & $winProcess & @CR)
   ProcessClose($pid1)
   ProcessClose($pid2)
Next
于 2013-07-05T11:22:14.247 回答