0

我正在尝试返回守护程序线程的结果。我正在使用 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()似乎不起作用

4

1 回答 1

0

我认为这对你有用:

import time
def check_for_input():
    global results
    from evdev import InputDevice, codes
    dev = InputDevice('/dev/input/event0')
    for event in dev.read_loop():
        if event.type == ecodes.EV_KEY:
            results = True

from threading import Thread
results = False
input_thread = Thread(target=check_for_input, daemon=True)
input_thread.start()

# do some other stuff
time.sleep(5)

input_thread.join()
print(results)
于 2020-07-23T09:52:02.223 回答