clicker占用了大量的处理器时间 - python 3

时间:2016-05-22 10:57:00

标签: python python-3.x ctypes pyautogui

我有一个简单的程序,可以执行以下操作: 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) 

非常感谢。

1 个答案:

答案 0 :(得分:2)

正确答案:我怀疑因while True:而不断进行投票。在那里插入sleeppyautogui.PAUSE(在循环内部,在if之前),如果进程休眠一段时间(甚至不到一秒),它会释放大量CPU周期

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

提示和备注

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

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

如果您将来遇到类似问题,请使用ImmunityWinDbg之类的内容附加处理,看看那里发生了什么