2017-02-12 10 views
0

メソッドがスレッド化されたthreading.Threadのサブクラスを作成しようとしています。私はビデオのためにそれを使用していますが、実際の例は一般的に人々のために有用であると思われます。スレッド化されたメソッドを使用したスレッド化サブフローの拡張(停止可能)

スレッドをインスタンス化したことがなく、start()メソッドを呼び出さなかったことがわかりましたが、どこから呼び出すかわからないのです。私はまた、stop()信号を受け取った場合、私はそれを停止することができるようにスレッドハンドルを保存したい。

import threading 

class VideoThread(threading.Thread): 
    """Thread class with a stop() method. The thread itself checks 
    regularly for the stopped() condition.""" 

    def __init__(self, playlist=None): 
     super(VideoThread, self).__init__() 
     self._stop = threading.Event() 
     self._player_pgid_list = [] 
     if playlist: 
      self.start_sequence(playlist) 

    def stop(self): 
     self._stop.set() 

    def stopped(self): 
     return self._stop.isSet() 

    def start_sequence(self, playlist): 
     if not isinstance(playlist, list): 
      raise ValueError("Expecting a list") 
     for video in playlist: 
      if not self.stopped(): 
       self.__start_video__(video) 

    def __start_video__(self, video): 
     if not isinstance(video, dict): 
      raise ValueError("Expecting a dictionary of video data") 
     # start the video 
     # store the video pgid so we can kill it if we have to 
     # tight wait loop to check for stopped condition 
     # kill all video(s) if necessary using the stored pgids 

クラスは実際には動作しますが、実際にはどのメソッドもスレッド化されていません。

video = VideoThread() 
video.start_sequence([films[1], films[3], films[2]]) 

それとも私はこのようなクラスをインスタンス化:

video = VideoThread([films[1], films[3], films[2]]) 

その後、私はそれを停止する必要がある場合

start_sequence()ので、私はこのような動画のネジシーケンスを開始することができます公開されています私はできます:

video.stop() 

私は何が欠けていますか?

答えて

1

start_sequenceメソッドの名前をrunに変更し、playlistパラメータ(代わりにself.playlistを使用)を削除する必要があります。また、__init__メソッドの最後の2行を削除してください。あなたが.startを呼び出すときに、それが呼び出す

playlist.stop() 

注:

playlist = VideoThread(films) 
playlist.start() 

そして、あなたが使用してそれを停止することができます:あなたのクラスを使用するために、次に

class VideoThread(threading.Thread): 


    def __init__(self, playlist=None): 
     super().__init__() 
     self._stop = threading.Event() 
     self._player_pgid_list = [] 
     self.playlist = playlist 

    def run(self): 
     if not isinstance(self.playlist, list): 
      raise ValueError("Expecting a list") 
     for video in self.playlist: 
      if not self.stopped(): 
       self.__start_video__(video) 

    ... 

ちょうどん:私は意味しますrunメソッドを個別の制御スレッドに追加するには、詳細についてofficial documentationを確認してください。

+0

このメソッドを使うと、 '' VideoThread(films).start() ''のように '' start() ''を連鎖できますか? –

+0

はい、できますが、もしそうした場合、スレッドへの参照が失われているので、後でそのスレッドを停止することはできません。個人的には、私がしないことです。 –

関連する問題