轮询键盘事件的Python程序具有很高的CPU使用率

时间:2017-05-23 09:16:54

标签: python multithreading user-interface

我制作了一个程序,每次按下某个键组合时都会启动一个短脚本。 我正在使用以下列方式使用pyHook的线程

def logic():
    global running
    hm = HookManager()
    hm.KeyDown = captureF
    hm.HookKeyboard()
    while(running):
        pythoncom.PumpWaitingMessages()
    return

其中captureF是一个函数,用于测试是否按下了某个组合键,然后按下了如何启动脚本。

在主线程上我正在运行一个包含选项和退出的Windows托盘gui(在按下退出时将标志running设置为false,导致逻辑线程完成)。

我现在面临的问题是程序启动时CPU使用率一直很高(即使脚本没有启动),我想问题是我测试键盘输入的方式,但我是不知道如何以更有效的方式做到这一点。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

问题是您的轮询占用CPU:Semaphore sem=new Sempahore(1); sem.aquire(); // Thread will aquire permit, another thread will wait //this will be synchronized block sem.release(); allows another thread to aquire permit 检查消息并在没有消息时立即返回(它是非阻塞的)

你必须插入某种延迟。最简单的是:

PumpWaitingMessages

1/100秒确保良好的反应性并为CPU提供喘息空间。我会让你调整价值。设置值越高,轮询的反应越少。

但是,如果您不需要对循环进行任何控制,您也可以使用阻止import time while(running): pythoncom.PumpWaitingMessages() time.sleep(0.01) 调用,而不需要循环。