如何实现暂停(和更多)功能?

时间:2011-01-22 17:41:01

标签: python windows multithreading

4 个答案:

答案 0 :(得分:4)

请记住,尽管在您的抽象级别中,“执行击键”是单个原子操作,但它在机器上实现为一个相当复杂的机器指令序列。因此,在任意点暂停线程可能会导致事物处于不确定状态。发送SIGSTOP与在任意点暂停线程的危险程度相同。但是,根据您在特定步骤中的位置,您的自动化可能会被破坏。例如,如果您在与时间相关的步骤中暂停。

在我看来,这个问题最好在自动化库的层面解决。我对您正在使用的自动化库不是很熟悉。可能值得联系库的开发人员,看看他们是否有任何关于在安全的子步骤级别暂停执行自动化步骤的建议。

答案 1 :(得分:2)

我不知道pywinauto。但是我假设你有类似于你获得的Application类,并且有像SendKeys / SendMouseEvent / etc这样的方法来做事。

创建自己的MyApplication类,该类包含对pywinauto应用程序类的引用。提供相同的方法,但在每个方法之前检查是否发生了暂停事件。如果有,您可以跳转到处理暂停事件的代码。这样,每次导致事件时都会检查暂停,但这一切都由一个类处理,而不会在代码中停顿。

一旦您检测到暂停,您可以按照自己喜欢的方式处理。例如,您可以抛出异常以强制放弃当前任务。

答案 2 :(得分:1)

分离功能和界面线程/进程肯定是最好的选择imho,第二种解决方案更快更容易,但绝对不是更好。

使用多个线程和异常可能比使用多个进程更好。但是,如果你使用多个进程而不是SIGSTOP可能是让它运行的唯一方法。

是否有任何反对使用2个线程?

  • 实际执行的1个帖子
  • 1个用于读取用户输入的线程

答案 3 :(得分:0)

我使用Python而不是pywinauto;对于这类任务,我使用AutoHotKey。在AutoHotkey脚本中实现简单暂停的一种方法可能是使用像ScrollLock这样的“切换”键并测试脚本中的键状态。此外,脚本可以在打开/关闭内部暂停设置后恢复键状态。