Что использовать вместо input () - PullRequest
0 голосов
/ 27 января 2020

в примере для чтения с устройств xbee:

device = XBeeDevice(PORT, BAUD_RATE)

try:
    device.open()

    def data_receive_callback(xbee_message):
        print("From %s >> %s" % (xbee_message.remote_device.get_64bit_addr(),
                                 xbee_message.data.decode()))

    device.add_data_received_callback(data_receive_callback)

    print("Waiting for data...\n")
    input()

finally:
    if device is not None and device.is_open():
        device.close()

finally:

    if device is not None and device.is_open():

        device.close()

Мне нужно запустить это в отдельном потоке, что использовать вместо input ()?

1 Ответ

2 голосов
/ 27 января 2020

Это просто грубый набросок, основанный на беглом взгляде на документацию XBeeDevice, но, грубо говоря, вы просто выполните серию блокировочных чтений, пока определенное условие не станет истинным, а затем выйдете.

def process_data(event):
    device = XBeeDevice(PORT, BAUD_RATE)
    device.open()
    while(event.is_set()):
        try:
            # 10 seconds is just a suggestion, as is what to do
            # if no data arrives in 10 seconds.
            data = device.read_data(10)
            print(..)
        except TimeoutException:
            pass  # Just try again
    device.close()

Чтобы запустить поток, создайте новый объект Thread и новый объект Event.

import threading

e = threading.Event()
e.set()

t = threading.Thread(target=process_data, args=(e,))
t.start()

# do some other stuff; eventually it's time to kill the loop in
# the thread.

e.clear()  # after this, e.is_set() will return False, and the loop
           # in your thread will exit.
...