Я собираю данные с акселерометра. Я хочу, чтобы пользователь мог начать запись данных и остановить запись, нажав кнопку запуска и остановки соответственно. Я решил сделать это с потоками, поэтому кнопка запуска создает поток, который собирает данные, а кнопка остановки останавливает этот поток и захватывает записанные данные.
Проблема, с которой я сталкиваюсь, заключается в том, что либо данные не записываются, либо при нажатии кнопки остановки поток не заканчивается, а вместо этого продолжает запись данных в течение от нескольких секунд до нескольких минут.
Что я делаю прямо сейчас, так это то, что поток запускает цикл, который записывает данные и проверяет, установлено ли для переменной значение True, если это так, цикл должен закончиться. У меня также есть функция end(), которая предназначена для вызова из основного потока и, как предполагается, устанавливает переменную в значение True, чтобы завершить поток.
class Capture(Thread):
def __init__(self,accel):
Thread.__init__(self)
self.accel=accel
self.ended=False
self.data=[]
self.lock=Lock()
def run(self):
while self.isEnded()==False:
self.lock.acquire()
self.data.append(self.accel.read())
self.lock.release()
def getData(self):
self.lock.acquire()
d=self.data
self.data=[]
self.lock.release()
return d
def isEnded(self):
self.lock.acquire()
end=self.ended
self.lock.release()
return end
def end(self):
self.lock.acquire()
self.ended=True
self.lock.release()
self.accel.read()
заблокировать на несколько минут? Пробовали ли вы:data = self.accel.read() \n with lock: self.data.append(data)
избежать блокировкиgetData()
надолго. Или читать меньшими порциями до разделителя записей? Или просто используйтеQueue.get_nowait()
без явной блокировки. Вам не нужен замок вокругself.ended
. Если вам нужно дождатьсяisEnded()
в другом потоке; вы могли бы использоватьthreading.Event.wait()
. Вам может вообще не понадобиться поток для чтения из файла без блокировки графического интерфейса, например,GObject.io_add_watch
- person jfs   schedule 04.04.2013