2016-05-22 71 views
1

我有一個簡單的程序,執行以下操作: 1)用戶點的鼠標的某處, 2)然後用戶按下空間, 3)和計算機做一定量的左在這一點上點擊鼠標左鍵。答題吃了大量的處理器時間 - 蟒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) 

非常感謝。

回答

2

正確答案:由於while True:我懷疑是不斷的輪詢。插入sleeppyautogui.PAUSE有(內循環的同時,if前),如果進程睡眠一段時間(甚至不到一秒鐘)它釋放了大量的CPU週期

不重要的優化: 您也是整個初始化每個循環中的User32.dll ...兩次(因爲or),似乎。 而USER32是HUGE

提示和說明

如果我記得蟒蛇規則的權利,你就可以移動到hllDll模塊級(上面的函數確定指標),get_space_state()無論如何都會找到它。或者你可以將它作爲參數傳遞。而你並不需要重新定義VK_SPACE每個函數調用 - 儘管這是一個微型優化

如果所有這些修補程序將無法正常工作,你應該使用調試器,找到怠工

的真正來源

如果你碰巧在將來會出現這樣的問題,請使用類似ImmunityWinDbg的程序來附加進程並查看發生了什麼

+0

感謝您的回答。 1)我應該如何以及在哪裏插入「睡眠」? 2)關於「兩次」 - 我改爲「如果get_space_state()<0:」 - 沒有什麼改進。 3)你知道初始化不是整個User32.dll的方法 - 但它是唯一需要的部分嗎? –

+0

不幸的是,不,我不知道如何導出一個單一的函數,但是如果你只需要導出一次庫文件就沒有多大關係了 - 加載 – strangeqargo

+1

你是對的。該問題僅在「if」之前插入一行:「time.sleep(0.02)」。其他一切都沒有關係。 –