Я создаю приложение, в котором непрерывно собираю данные с устройства National Instruments и выполняю некоторую обработку в реальном времени.Я пытаюсь подключить часть сбора данных к графическому интерфейсу PyQt, чтобы пользователь мог запускать, останавливать и настраивать сбор данных и просматривать их.У меня есть один класс для сбора данных и один класс для графического интерфейса.Я запускаю процесс сбора данных в виде потока в графическом интерфейсе:
# data acquisition class
class intensimetre():
#initialize the data acquisition
def __init__(self,app=None,l1=None,l2=None,l3=None):
#...
#start the data acquisition
def demarrer(self,fs=51200.,sensibilite0=12.2,sensibilite1=10.7, rho=1.21, espaceur=0.012, c=343):
#start the acquisition task
nidaq.DAQmxStartTask(tache)
#if i add this line it works
#raw_input(u'appuyez sur entree pour continuer')
#gui class
class GUI_acquisition(QtGui.QWidget):
def __init__(self, app=None):
super(GUI_acquisition, self).__init__()
#create the gui
#...
#create an instance of the data acquisition class
self.intensimetre=
intensimetre(app=self.app,l1=self.l1,l2=self.l2,l3=self.l3)
def demarrer(self):
#start the data acquisition in a thread
t = threading.Thread(target=self.intensimetre.demarrer)
t.start()
Проблема заключается в том, что приложение вылетает, как только я начинаю сбор данных.Если я добавлю строку raw_input после начала сбора данных, она будет работать как надо.Тем не менее, это не похоже на правильный способ сделать это.Похоже, что после того, как получение начато, поток возвращается, и обратные вызовы от получения не обрабатываются должным образом.Есть идеи, как это исправить?
Обновление
Я заменил строку raw_input
бесконечным циклом, опрашивающим состояние атрибута состояния:
while self.isRunning:
sleep(0.1)
Я установилатрибут isRunning
до True
, когда пользователь нажимает кнопку пуска, и False
при нажатии кнопки остановки.Хотя это работает, мне не нравится опрос, поскольку я думаю, что это может негативно повлиять на производительность моего приложения.