Может быть, вы можете вызвать функцию как поток для асинхронного выполнения, добавить их в свою очередь или задать условие, чтобы оно не выполнялось, если оно уже запущено, что прекратит заполнять сообщение, которое не работает. Опция 1. Это добавит выполнение функции в очередь потоков:
import pythoncom, pyHook, threading
lock = threading.Lock()
def myFunc(i):
lock.acquire() #execute next function until previous has finished
#some code
lock.release()
def OnKeyboardEvent(event):
keyPressed = chr(event.Ascii)
if keyPressed == 'z':
t = threading.Thread(target=myFunc, args=(1,)) #added to queue
t.start()
return True
hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()
Опция 2. или игнорирует другие вызовы обработки, если она занята:
def myFunc(i):
myFunc.isRunning = True
#some code
myFunc.isRunning = False
myFunc.isRunning = False
def OnKeyboardEvent(event):
keyPressed = chr(event.Ascii)
if keyPressed == 'z':
if not myFunc.isRunning: #if function is being executed ignore this call
t = threading.Thread(target=myFunc,args=(1,))
t.start()
return True
конечно, вы должны быть осторожны, когда добавляете код, фиксируя исключения, иначе поток останется заблокированным.