class Mainloop(QObject): ready = pyqtSignal(bool, dict) stopped = pyqtSignal() report = pyqtSignal(int, str) state = pyqtSignal(int, str) notify = pyqtSignal(str, str) def __init__(self, parent=None): super(Mainloop, self).__init__(parent) self.queue = None self.thread = None self.db = None def spawn_device_greenlets(self, terminal, devices): return [spawn(device_loop, terminal, self, addr) for addr in devices] def _mainloop(self): terminal = Terminal() if not terminal.is_open(): self.notify.emit(u'Ошибка', u'Нет связи с концентратором') self.ready.emit(False, {}) return if self.db is None: self.db = DB(notify=lambda title, msg: self.notify.emit(title, msg)) titles = self.db.get_terminals() devices = titles.keys() if not devices: self.notify.emit(u'Ошибка', u'Нет информации о терминалах') self.ready.emit(False, {}) return self.queue = Queue() self.ready.emit(True, titles) greenlets = self.spawn_device_greenlets(terminal, devices) while True: command = self.queue.get() if callable(command): command(terminal) else: [greenlet.kill() for greenlet in greenlets] break terminal.close() self.queue = None self.stopped.emit() def start(self): self.thread = Thread(target=self._mainloop) self.thread.start() def stop(self, block=False): if self.queue: self.queue.put(None) if block: self.thread.join() def test_display(self): test_message = u'Тестовое сообщение' self.queue.put(lambda terminal: TerminalMessage(test_message).set(terminal, 0xFF, 5)) def update_config(self, addr=0xFF): self.queue.put(lambda terminal: TerminalTime().set(terminal, addr)) self.queue.put(lambda terminal: TerminalStrings(self.db).set(terminal, addr)) self.queue.put(lambda terminal: TerminalCounters(self.db).set(terminal, addr)) def terminal_open(self, addr): self.queue.put(lambda terminal: TerminalState('man', 'open').set(terminal, addr, self.db)) def terminal_close(self, addr): self.queue.put(lambda terminal: TerminalState('man', 'close').set(terminal, addr, self.db))