2015-01-28 13 views
0

나는 먼 길을왔다. 나는 거의 다 왔어. 스레드를 사용하여 스레딩으로 변환했으며 이제 비디오를 중간 재생할 수 있지만 첫 번째 비디오를 죽이거나 중지하는 데 여전히 문제가 있습니다. 기본적으로 비디오 플레이어는 OMXplayer를 사용하여 Raspberry Pi의 버튼으로 제어합니다. 지금은 한 비디오가 다른 버튼을 누르기 전에 재생을 마칠 때까지 기다려야합니다. 그렇지 않으면 여러 비디오가 동시에 재생되기 때문에 충돌이 발생합니다.활성 스레드 살해 또는 중지

많은 도움을 주셔서 감사합니다.

#!/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 
+0

사용'Thread.stop를을 스레드를 중지 할 수 있습니다. –

+0

일부 코드를 읽었습니다 ... 같은 스레드를 사용하지 않는 이유는 무엇입니까? 그리고 파이썬에는'thread.stop()'이 없습니다 : https://docs.python.org/2/library/threading.html#thread-objects –

+0

당신이 쓰레드를 상속하고 Boolean 보초를 사용하여 구현할 수 있다는 것을 의미했습니다. . –

답변

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 

그런 다음 당신의 기능에서 잠시 루프를 제거합니다.

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

v1.start() 
v2.start() 

그런 다음 당신은`) (언제든지

v1.stop() 
v2.stop() 
+0

방금 ​​다시 시작한 비디오가 없습니다 ... 닫습니다! 각 버튼을 누를 때마다 "Play Dodgeballs"와 "Play Shoppingcarts"사이에서 전환됩니다. 나는 omxplayer로 놀 것이다. 전에는 잘 작동했지만 결코 알지 못했습니다. 도움에 다시 한번 감사드립니다. – jmcclaire

+0

동영상 플레이어에 문제가 있음을 알려드립니다. 파이 게임으로 해보는 건 어때? –

+0

나는 그것을 밖으로 시도 할 것이다. 전에는 그렇게 했었지만 단순 해 보였으므로 omxplayer로 전환했습니다. – jmcclaire