【问题标题】:clicker eats a lot of processor time - python 3Clicker 会占用大量处理器时间 - python 3
【发布时间】:2016-09-19 07:09:02
【问题描述】:

我有一个简单的程序,它执行以下操作: 1)用户将鼠标指向某处, 2)然后用户按空格键, 3) 并且计算机在该点执行一定数量的鼠标左键点击。

该程序运行良好,只有一个问题 - 它占用了 4 核处理器上 30-50% 的处理器时间。问题出在哪里?

import pyautogui
import ctypes

pyautogui.FAILSAFE = True

def get_space_state():
    hllDll = ctypes.WinDLL ("User32.dll")
    VK_SPACE = 0x20
    return hllDll.GetKeyState(VK_SPACE)

while True:
    if get_space_state() == -127 or get_space_state() == -128:
        print ("yes")
        pyautogui.click(clicks=40 , interval=0.01) 

非常感谢。

【问题讨论】:

    标签: python python-3.x ctypes pyautogui


    【解决方案1】:

    正确答案:我怀疑是因为while True: 而经常轮询。在此处插入sleeppyautogui.PAUSE(在while 循环内,if 之前),如果进程休眠一段时间(甚至不到一秒),它会释放大量 CPU 周期

    次要优化: 此外,您似乎在每个循环中初始化整个 User32.dll ......两次(因为or)。 而 User32 是HUGE

    提示和注意事项

    如果我没记错 python 规则,你可以将hllDll 移动到模块级别(高于函数定义),get_space_state() 无论如何都会找到它。或者您可以将其作为参数传递。而且你不需要在每次函数调用时都重新定义 VK_SPACE - 尽管这是一个微优化

    如果所有这些修复都不起作用,您应该使用调试器来找到真正的减速源

    如果您将来碰巧遇到此类问题,请使用 ImmunityWinDbg 之类的东西附加到进程并查看那里发生了什么

    【讨论】:

    • 感谢您的回答。 1)我应该如何以及在哪里插入“睡眠”? 2)关于“两次” - 我改为“如果 get_space_state()
    • 遗憾的是,不,我不知道如何导出单个函数,但如果你只导出一次 lib 也没关系 - 在加载时
    • 你是对的。只需一行即可解决问题:在“if”之前插入“time.sleep(0.02)”。其他一切都无所谓。
    • 这可能很重要,但我猜只在非常高负载的处理上,这不是简单的点击器的选项:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2017-07-23
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多