2016-09-01 3 views
0

У меня есть куча кода, и я прилагаю здесь кусок. В принципе у меня есть нить, - которая ориентирована на функции - которая имеет время цикла следующим образом:Queue-Multi Threading Python

while not stop_event.wait(1): # Continuous Reading Function 

    #print "hello2" 
    #print ("working on %s" % arg) 
    data1 = Read(soa1, bytes1, ser) 
    data2 = Read(soa2, bytes2, ser) 
    data3 = Read(soa3, bytes3, ser) 

    data = np.concatenate([data1, data2, data3]) 
    print data.size 
    queue_read.put(data) 
    time.sleep(1) 

Я чтение данных из MCU, через последовательный канал связи в этой теме и отправить его обратно к моему главному program - используя queue_read.put (данные). Это происходит каждые 1 секунду.

В моей основной программе я читаю выход из этого потока, как ---

self.data = queue_read.get() 

Через пять минут значения в MCU намеренно изменены. Во время изменения этот поток все еще работает, поскольку он находится в цикле while.

Итак, после пяти минут переменная «данные» должна иметь обновленные новые значения из MCU. Но, к моему удивлению, это не так. Он все еще имеет начальные значения. Здесь что-то не хватает? Использует ли очередь, правильный способ получить данные?

+0

'Queue' идеально подходит для производителей/потребительских потоков. Но нам нужно увидеть, что «введите код здесь» находится в OP, чтобы помочь –

+0

@CraigBurgler. Я редактировал вопрос. Проблема заключается в self.data или переменная «данные» не обновляется, потому что, как только моя основная программа прошла через строку кода self.data = queue_read.get(), она не будет читать снова. Поэтому мне интересно, как я должен постоянно читать данные из потока и обновлять свой графический интерфейс –

+0

, пожалуйста, см. Мой ответ –

ответ

0

Следующий подход считывает и обрабатывает данные из непрерывно очереди, которая позволяет видеть и реагировать на изменения данных, как они происходят:

while True: 
    self.data = queue_read.get() 
    self.update_GUI() 

queue_read.get() блоков, если queue_read пуст. Вам нужно будет запустить этот код в своем потоке, если основной поток выполняет что-либо, кроме обновления графического интерфейса.