Я работаю в приложении, где мне нужно получить данные из потока (последовательный порт) и построить их. У меня есть два, три потока: основной поток, поток последовательного чтения и поток, который я буду использовать для рефракции sh графиков с 10 до 30 Гц.
Поскольку данные принимаются быстрее, чем 30 Гц, я хотите поместить полученные данные в очередь, чтобы при обновлении графика потоком sh можно было взять все новые данные и построить их.
Проблема в том, что полученные данные представляют собой список с десять значений по одному для каждого сигнала данных, я помещаю его в свою очередь с помощью q.put (data), но когда я выполняю q.get () в потоке обновления, я могу прочитать только последнее значение, которое я поместил в очередь, а не те, что были раньше.
Итак, я смоделировал входящий поток для отправки данных каждые 100 мс и обновления до 1 секунды.
Позволяет сказать, что введенные мной данные:
[1,1,1,1,1,1]
[2,2,2,2,2,2] ...
[10,10,10,10,10,10]
Когда я получаю данные в очереди потока обновления с
while not self.q.empty():
print(q.get())
, я получаю 10 раз:
[10,10,10,10,10,10 ]
Так нравится сохраняет последнее значение, но для всех операций put.
Когда я пытаюсь использовать целое число вместо списка, оно работает как положено.
Я также пытался инкапсулировать список в классе, но когда Я читаю список внутри класса и получаю тот же результат.
Пример для проверки:
import queue
from threading import Thread
import time
class PlotsManager(object):
def __init__(self):
simulator = Simulator(self)
simulator.startSimulator()
self.samplesQueue = queue.Queue()
thread = Thread(target=self.plotSamples)
thread.start()
def putSamples(self, samples): #Puts the samples in the queue
print("Samples in: {}".format(samples))
self.samplesQueue.put(samples)
def plotSamples(self): #Pops the samples from the queue
while (1):
time.sleep(1)
while not self.samplesQueue.empty():
lastSamples = self.samplesQueue.get()
print("Samples out: {}".format(lastSamples))
class Simulator():
def __init__(self, PlotsManager):
self.plotManager = PlotsManager
def simulateNewData(self):
counter = 0
samples = [None] * 5
while (True):
# counter += 0.4
counter += 1
if counter > 100:
counter = 0
time.sleep(0.1)
for i in range(5):
samples[i] = counter
self.plotManager.putSamples(samples)
def startSimulator(self):
thread = Thread(target=self.simulateNewData)
thread.start()
if __name__ == "__main__":
pm = PlotsManager()
Вывод:
Samples in: [1, 1, 1, 1, 1]
Samples in: [2, 2, 2, 2, 2]
Samples in: [3, 3, 3, 3, 3]
Samples in: [4, 4, 4, 4, 4]
Samples in: [5, 5, 5, 5, 5]
Samples in: [6, 6, 6, 6, 6]
Samples in: [7, 7, 7, 7, 7]
Samples in: [8, 8, 8, 8, 8]
Samples in: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples out: [9, 9, 9, 9, 9]
Samples in: [10, 10, 10, 10, 10]
Samples out: [10, 10, 10, 10, 10]
Samples in: [11, 11, 11, 11, 11]
Samples in: [12, 12, 12, 12, 12]
Samples in: [13, 13, 13, 13, 13]
Samples in: [14, 14, 14, 14, 14]
Samples in: [15, 15, 15, 15, 15]
Samples in: [16, 16, 16, 16, 16]
Samples in: [17, 17, 17, 17, 17]
Samples in: [18, 18, 18, 18, 18]
Samples in: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Samples out: [19, 19, 19, 19, 19]
Если он изменяется на число вместо списка образцов работает как положено.