Есть ли лучший способ для получения последовательных данных в потоке, в то время как у меня есть другой поток, посвященный serial.read ()? - PullRequest
0 голосов
/ 06 февраля 2019

Я работаю над графическим интерфейсом Python для тестирования устройства.Хотя у меня довольно мало предыдущего опыта работы с Python, я смог заставить работать мой графический интерфейс.Мой графический интерфейс отправляет и получает все команды от устройства через последовательное соединение.В настоящее время при запуске последовательного соединения создается отдельный поток, который опрашивает serial.readline () и передает данные (после некоторого анализа) обратно в основной графический интерфейс.В основном графическом интерфейсе у меня есть функция маршрутизации, которая отправляет данные в соответствующее место, где данные необходимы.Это работает для всех моих потребностей, кроме случаев, когда мне нужно запускать большие сценарии, для которых требуются команды чтения и записи из сценария.Функции, которые в данный момент работают, просто записывают на устройство нажатием кнопки, и затем функция завершается.Таким образом, что главное решает делать с данными, это отдельный процесс в целом.Тем не менее, у меня есть пара функций, которые запускают более длинные сценарии, которые я вынужден запускать в отдельном потоке, в противном случае они будут блокировать ответ GUI.Теперь у меня проблема.Так как у меня один поток жестко опрашивает последовательное соединение, и я не знаю способа прямой связи между потоками (т. Е. Отправлять данные, прочитанные и анализируемые последовательным потоком, непосредственно в поток сценариев по мере необходимости), для меня нет никакого способачтобы получить данные из основного туда, где мне нужно значение в сценарии сразу.В настоящее время я временно отключаю поток последовательного чтения во время выполнения сценария и пытаюсь выполнить все вызовы serial.read () и serial.write () из потока, но это кажется очень неэффективным способом решения этой проблемы.,Мой вопрос в этом: есть ли лучшая структура программного обеспечения, которую я должен рассмотреть, чтобы решить эту проблему, есть ли лучший способ сделать это в Python, о котором я не знаю (я пришел из C ++ фона), или это то, что я 'В настоящее время я пытаюсь решить мою проблему наилучшим образом?

К сожалению, я не могу опубликовать код из-за личных ограничений, но любая форма помощи будет принята с благодарностью.

1 Ответ

0 голосов
/ 06 февраля 2019

Посмотрите на этот вопрос переполнения стека .Он предлагает использовать очереди для связи между потоками.Вот пример того, как его использовать:

import threading, Queue

def func1(num, q):
    while num < 100000000:
        num =  num**2
        q.put(num)

def func2(num, q):
    while num < 100000000:
        num = q.get()
        print num,

num = 2
q = Queue.Queue()
thread1 = threading.Thread(target=func1,args=(num,q))
thread2 = threading.Thread(target=func2,args=(num,q))
thread1.start()
thread2.start()

Счастливого кодирования!

...