Форум сайта python.su
1
Добрый день.
Конструирую тут простую програмку с синхронным управлением несколькими плеерами (mplayer-ы в slave режиме) с использованием mplayer.py ( https://pypi.python.org/pypi/mplayer.py/0.7.0 ) и tkinter.
По причине некоторой латентности мплеера возникла необходимость выполнять часть задач в отдельных потоках.
Т.к. я кроил уже почти готовый скрипт, то архитектура получилась далеко не ахти, но отзывчивость интерфейса явно улучшилась.
для управления плеером (каждым в отдельности) я построил такую конструкцию
def start_worker(self, player): def _worker(): while self.running: wq = self.worker_queue gq = self.gui_queue while wq.qsize() and player and self.running: try: (command, params) = wq.get(0) if command == 'pause': player.pause() self.paused = not self.paused state = 'P' if player.paused else '' gq.put({'lb_state': state }) elif command == 'stop': if not player.paused: player.pause() self.paused = True gq.put({'lb_state': 'P' }) # ...... else: print 'unknown command %s (%s)'%(command, params) except Queue.Empty: time.sleep(0.1) print '_worker stop' return _worker #...... w_thread = threading.Thread(target = self.start_worker(self.player)) w_thread.start() #......
def pause(self, b=None): if self.player: if b == True: self.worker_queue.put(('stop','')) elif b == False: self.worker_queue.put(('play','')) else: self.worker_queue.put(('pause',''))
[ p.pause(self.paused) for p in self.v_pull ]
Офлайн
Лень понимать до конца ваш код, но такая теория, один из воркеров хапает своё задание, а потом чужое, пока другой воркер зависает по некоторым причинам.
Офлайн
1
Думал уже. воркеры, предполагается, для каждого плеера свои. Каждый плеер являет собой екземпляр со своим собственным воркером и очередями.
Также, т.к. у каждого объекта только один воркер в отдельном потоке, никаких loc-ов я не использовал.
Наверное mplayer не успевает изменить своё состояние между двумя коммандами.
Отредактировано alexzander77 (Июнь 23, 2013 14:59:25)
Офлайн