gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:33:44 25 4
gpt4 key购买 nike

我事先为问题的长度道歉,我不想遗漏任何内容。

一些背景资料

我试图通过编写一个 Python 应用程序来自动化数据输入过程,该应用程序使用 Windows API 来模拟击键、鼠标移动和窗口/控件操作。我不得不求助于这种方法,因为我(还)没有直接(例如使用 SQL)或通过更合适的 API 间接访问数据存储/数据库所需的安全许可。官僚主义,这是一种痛苦;-)

数据输入过程涉及由于商品可用性的变化而更正销售订单。不可用的商品要么从订单中删除,要么由另一合适的商品代替。

最初,我希望有人能够监控自动数据输入过程,以确保一切正常。为了实现这一点,我一方面放慢了 Action 的速度,但也通过固定窗口通知用户当前正在发生的事情。

实际问题

为了允许用户停止自动化过程,我将 Pause/Break 键注册为热键,并且在处理程序中我想暂停自动化功能。但是,我目前正在努力寻找一种方法来正确暂停自动化功能的执行。当暂停功能被调用时,我希望自动化过程停止在它的轨道上,无论它在做什么。我什至不希望它执行另一个击键。

更新 [23/01]:实际上,我想做的不仅仅是暂停,我希望能够在自动化流程运行时与其进行通信并请求它暂停、跳过当前的销售订单、完全放弃甚至更多。

任何人都可以向我展示实现我想要的正确方法(TM)吗?

更多信息

这是自动化如何工作的示例(我正在使用 the pywinauto library ):

from pywinauto import application
app = application.Application()
app.start_("notepad")
app.Notepad.TypeKeys("abcdef")

更新 [25/01]:在我的应用程序上工作几天后,我注意到我并没有真正使用 pywinauto,现在我只使用它来查找窗口,然后我直接使用 SendKeysCtypes.SendKeys模拟键盘输入和 win32api模拟鼠标输入的功能。

到目前为止我发现了什么

以下是我迄今为止在寻找答案时遇到的一些方法:
  • 我可以在两个单独的过程中分离自动化功能和界面 + 热键监听器。让我们将前者称为“自动化器”,将后者称为“管理器”。然后,管理器可以通过向进程发送 SIGSTOP 信号并使用 SIGCONT 信号(或通过 SuspendThread/ResumeThread 的 Windows 等效项)取消暂停来暂停自动机的执行。

    为了能够更新用户界面,自动化器将需要通过某种 IPC 机制通知管理器它的进展。

    缺点:
  • 使用 SIGSTOP 会不会有点苛刻?它甚至能正常工作吗?许多人似乎反对它,甚至称其为“危险的”。
  • 我担心实现 IPC 机制会有点复杂。另一方面,我曾与 DBus 合作过,这并不难实现。
  • 第二种方法和许多人似乎建议的方法涉及使用线程,基本上归结为以下(简化):
    while True:
    if self.pause: # pause
    # Do the work...

    但是,这样做似乎只会在没有更多工作要做后才会暂停。我认为这种方法可行的唯一方法是将工作(整个自动化过程)划分为更小的工作段(即任务)。在开始一个新任务之前,工作线程会检查它是否应该暂停和等待。

    缺点:
  • 似乎将工作划分为更小的部分(例如上面的部分)的实现在代码方面(美学上)非常丑陋。

    按照我的想象,所有语句都将转换为如下所示:queue.put((function, args)) (例如 queue.put((app.Notepad.TypeKeys, "abcdef")) )并且您将让自动化进程线程运行任务并在开始任务之前不断检查暂停状态。这不可能是对的...
  • 该程序实际上不会完全停止,而是在实际暂停之前首先完成一项任务(无论多么小)。

  • 取得的进展

    更新 [23/01]:我已经通过提到的 SuspendThread/ResumeThread 使用第一种方法实现了我的应用程序的一个版本。功能。到目前为止,这似乎工作得很好,并且还允许我像编写任何其他脚本一样编写自动化内容。我遇到的唯一怪癖是键盘修饰符(CTRL、ALT、SHIFT)在暂停时“卡住”。我可能可以轻松解决的问题。

    我还使用第二种方法(线程和信号/消息传递)编写了一个测试并实现了暂停功能。然而,它看起来真的很丑(检查暂停标志和与“做工作”相关的一切)。因此,如果有人可以向我展示类似于第二种方法的正确示例,我将不胜感激。

    相关问题
  • Pausing a process?
  • Pausing a thread using threading class

    Alex Martelli posted an answer说:

    There is no method for other threads to forcibly pause a thread (any more than there is for other threads to kill that thread) -- the target thread must cooperate by occasionally checking appropriate "flags" (a threading.Condition might be appropriate for the pause/unpause case).



    然后他提到了多处理模块和 SIGSTOP/SIGCONT。
  • Is there a way to indefinitely pause a thread?
  • Pausing a process in Windows

    An answer to this question引用有关 SuspendThread 的 MSDN 文档:

    This function is primarily designed for use by debuggers. It is not intended to be used for thread synchronization. Calling SuspendThread on a thread that owns a synchronization object, such as a mutex or critical section, can lead to a deadlock if the calling thread tries to obtain a synchronization object owned by a suspended thread. To avoid this situation, a thread within an application that is not a debugger should signal the other thread to suspend itself. The target thread must be designed to watch for this signal and respond appropriately.

  • Is there any way to kill a Thread in Python?
  • How do I pass an exception between threads in python
  • 最佳答案

    我不知道pywinauto。但我会假设您有类似 Application 类的东西,您可以获得它并有类似 SendKeys/SendMouseEvent/etc 的方法来做事。

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

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

    关于python - 如何实现暂停(和更多)功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769432/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com