Уничтожение или остановка активного потока

Я прошел долгий путь и почти достиг цели. Я перешел с использования Thread на Threading и теперь могу переключать видео во время воспроизведения, но у меня все еще возникают проблемы с завершением или остановкой первого видео. По сути, я делаю видеоплеер, управляемый кнопками на Raspberry Pi, используя OMXplayer. На данный момент мне нужно дождаться окончания воспроизведения одного видео, прежде чем нажимать другую кнопку, иначе произойдет сбой, потому что одновременно воспроизводятся несколько видео.

Большое спасибо за любую помощь, которую вы, ребята, можете предложить.

#!/usr/bin/python

import RPi.GPIO as GPIO
import subprocess
import threading
import time

GPIO.setmode (GPIO.BCM)
GPIO.setwarnings (False)

GPIO.setup(9, GPIO.IN)  # Button 1
GPIO.setup(10, GPIO.IN) # Button 2

def shoppingcart():
        global current_video
        while True:
                if GPIO.input(9):
                        #current_video.terminate()
                        #current_video.kill()
                        print "Play Shoppingcart"
                        time.sleep(1)
                        current_video=subprocess.Popen(['omxplayer','-b','Desktop/videos/shoppingcart.mp4'],
                                        stdin=subprocess.PIPE,stdout=subprocess.PIPE,
                                        stderr=subprocess.PIPE,close_fds=True)

def dodgeballs():
        global current_video
        while True:
                if GPIO.input(10):
                        #current_video.terminate()
                        #current_video.kill()
                        print "Play Dodgeballs"
                        time.sleep(1)
                        current_video=subprocess.Popen(['omxplayer','-b','Desktop/videos/dodgeballs.mp4'],
                                        stdin=subprocess.PIPE,stdout=subprocess.PIPE,
                                        stderr=subprocess.PIPE,close_fds=True)

v1 = threading.Thread( name='shoppingcart', target=shoppingcart ) # Videos thread
v2 = threading.Thread( name='dodgeballs', target=dodgeballs )   # Videos thread

v1.start()
v2.start()

while True:
        pass

GPIO.cleanup() #Reset GPIOs

person jmcclaire    schedule 28.01.2015    source источник
comment
Используйте 1_.   -  person Malik Brahimi    schedule 28.01.2015
comment
Я прочитал кое-что из вашего кода... Почему бы не использовать тот же поток? И в python нет thread.stop(): docs.python.org/2/ библиотека/threading.html#thread-objects   -  person Reut Sharabani    schedule 28.01.2015
comment
Я имел в виду, что вы могли бы реализовать его, унаследовав Thread и используя булево часовое.   -  person Malik Brahimi    schedule 28.01.2015
comment
Да, вы могли бы... Но я полагаю, что следующее, что он хочет сделать, это открыть еще одну тему. Зачем беспокоиться? :)   -  person Reut Sharabani    schedule 28.01.2015
comment
@ReutSharabani Я только что попытался поместить их в одну ветку, и мне все еще нужен способ остановить подпроцесс или видео до воспроизведения следующего видео. Я поместил их в отдельные потоки, потому что пытался убить поток, а не подпроцесс.   -  person jmcclaire    schedule 29.01.2015
comment
@MalikBrahimi Я пробую это прямо сейчас. Пальцы скрещены, я делаю это правильно. Новичок в доме здесь. хахаха   -  person jmcclaire    schedule 29.01.2015
comment
Да, я разместил полный код ниже, если хотите. См. здесь.   -  person Malik Brahimi    schedule 29.01.2015
comment
Как это прошло для вас?   -  person Malik Brahimi    schedule 29.01.2015


Ответы (1)


Вам нужно реализовать свои собственные потоки:

class RaspberryThread(threading.Thread):
    def __init__(self, function):
        self.running = False
        self.function = function
        super(RaspberryThread, self).__init__()

    def start(self):
        self.running = True
        super(RaspberryThread, self).start()

    def run(self):
        while self.running:
            self.function()

    def stop(self):
        self.running = False

Затем удалите циклы while из своих функций, чтобы вы могли передавать их потокам.

v1 = RaspberryThread(function = shoppingcart)
v2 = RaspberryThread(function = dodgeballs)

v1.start()
v2.start()

Затем вы можете остановить потоки в любое время

v1.stop()
v2.stop()
person Malik Brahimi    schedule 28.01.2015
comment
Я только что перезапустил, а видео все еще нет... так близко! Однако он будет переключаться между Play Dodgeballs и Play Shoppingcarts, когда я нажимаю каждую кнопку. Поиграюсь с omxplayer. Раньше все работало нормально, но никогда не узнаешь. Спасибо еще раз за помощь. - person jmcclaire; 29.01.2015
comment
Я говорю вам, что это проблема с вашим видеоплеером. Почему бы вам не попробовать поиграть с Pygame? - person Malik Brahimi; 29.01.2015
comment
Я попробую это. Я делал это раньше, но переключился на omxplayer, потому что он показался мне проще. - person jmcclaire; 29.01.2015
comment
Дайте мне знать, если вам нужно что-то еще, но я рекомендую использовать надежный инструмент командной строки для воспроизведения мультимедиа. - person Malik Brahimi; 29.01.2015
comment
Я постараюсь. Я должен запустить это с помощью кнопок GPIO, управляющих видео. Это единственный способ, который я знаю. Если вы знаете другой метод, обязательно напишите мне! Спасибо! jmcclaire [в] gmail [точка] com - person jmcclaire; 29.01.2015
comment
Я рекомендую использовать игровой USB-контроллер, которым можно управлять с помощью Pygame, или просто использовать клавиатуру. - person Malik Brahimi; 29.01.2015
comment
Я строю интерактивную стену, и видео должны управляться уже установленными аркадными кнопками. - person jmcclaire; 29.01.2015
comment
jmclaire, мой код был на самом деле ошибочным, потому что я забыл переопределить метод потоков start. Теперь он должен работать правильно, и он должен воспроизводить ваши видео с помощью omxplayer. - person Malik Brahimi; 29.01.2015
comment
@Malik Brahimi Я также хочу добавить функцию live(), но затем я делаю это в классе RaspberryThread: def live(self): return super(TestThread, self).isAlive(), а затем выполняю: v1.alive() Я получаю ложь. Ты знаешь почему? - person pandasCat; 12.07.2018
comment
@Malik Brahimi Неважно, я понял, почему возникла проблема с присоединением. Одна проблема, с которой я сталкиваюсь при использовании RaspberryThread: python(33400,0x700003b2b000) malloc: *** ошибка для объекта 0x7fd2bea2fe00: освобождаемый указатель не был выделен *** установить точку останова в malloc_error_break для отладки Ловушка отмены: 6 Я думаю, что это проблема возникает из-за остановки (), но я не слишком уверен. Я пытался отладить в течение нескольких часов:/ - person pandasCat; 12.07.2018