我正在尝试返回守护程序线程的结果。我正在使用 evdev 来监视触摸输入事件,如果触摸事件超过 0 个,那么我想返回 True。我正在尝试将列表作为 arg 传递给线程的目标函数,在这个版本中,我将附加到列表中。但是,我RuntimeError: There is no current event loop in thread
在第一次触摸时不断收到错误。
import time
def check_for_input(result):
from evdev import InputDevice, codes
dev = InputDevice('/dev/input/event0')
for event in dev.read_loop():
if event.type == ecodes.EV_KEY:
result.append([True])
from threading import Thread
results = [False]
input_thread = Thread(target=check_for_input, args=(results), daemon=True)
input_thread.start()
# do some other stuff
time.sleep(5)
input_thread.join()
print(results)
我该如何解决这个问题,一旦我解决了这个错误,它会起作用吗?作为一个额外的问题,这是最好/最简单的方法吗?
编辑:我已经设法通过在线程中创建一个循环来消除运行时错误。此外,使用 Bhargav 的建议,我可以将结果作为全局变量。所以我的代码目前是这样的:
import time
import asyncio
def check_for_input(stop_event):
print('started')
global results
from evdev import InputDevice, ecodes
dev = InputDevice('/dev/input/event0')
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
for event in dev.read_loop():
if event.type == ecodes.EV_KEY:
results = True
break
if stop_event.is_set():
break
print('EXITING')
from threading import Thread, Event
stop_event = Event()
stop_event.clear()
results = False
input_thread = Thread(target=check_for_input, args=(stop_event,), daemon=True)
print('about to start')
input_thread.start()
# do some other stuff
time.sleep(5)
stop_event.set()
print(results)
但是,根据我的附加问题,这是正确的方法吗?我相信人们会说这里要避免使用全局变量。另外,我怎样才能在我之前杀死线程print(results)
?以上stop_event.set()
似乎不起作用