Я пытаюсь связать два потока через threading.Event ().
Первый поток - listener
, который является регистратором клавиатуры из pynput. Внутри него есть функция под названием write_keys()
, которая будет читать каждый ключ и объединять их, передавая конкатенатор функции foo()
, эта функция будет ждать выполнения.
Второй поток - timer
, который покажет продолжительность простоя, когда условие выполнено, установит событие для запуска функции foo()
.
В настоящее время это не работает и замедляет прослушиватель, где я могу ввести только один для каждого события
from ctypes import Structure, windll, c_uint, sizeof, byref
from threading import Thread, Event
from pynput import keyboard
from time import sleep
keys = []
message = ' '
# LAST INPUT INFO
class LASTINPUTINFO(Structure):
_fields_ = [
('cbSize', c_uint),
('dwTime', c_uint),
]
def get_idle_duration():
while True:
lastInputInfo = LASTINPUTINFO()
lastInputInfo.cbSize = sizeof(lastInputInfo)
windll.user32.GetLastInputInfo(byref(lastInputInfo))
millis = windll.kernel32.GetTickCount() - lastInputInfo.dwTime
millis = millis / 1000.0
print(f'\t{millis}')
sleep(1)
if int(millis) == 3: # every 3 sec user is AFK, trigger event.set()
print(f'\t{millis}')
event.set()
def foo(k):
event.wait()
print(f'Event set: {event.is_set()}')
print(f'{k}')
print('PROCESS FINISHED\n')
sleep(3)
event.clear()
def write_keys(keys):
global message
for key in keys:
k = str(key).replace("'", "")
print(k, len(k))
message += k # concatenate keys
if (len(message)) >= 3:
foo(message)
def on_press(key):
global keys
keys.append(key)
write_keys(keys)
keys = []
if __name__ == "__main__":
event = Event()
listener = keyboard.Listener(on_press=on_press)
timer = Thread(target=get_idle_duration)
listener.start()
timer.start()
ОЖИДАЕМЫЙ ВЫХОД:
listener timer
k 0
1
e 0
y 0
1
2
3
output: key
gist.github: ссылка на code
Я новичок в событиях в библиотеке потоков, любой совет будет рассмотрен.