メソッドがスレッド化された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()
私は何が欠けていますか?
このメソッドを使うと、 '' VideoThread(films).start() ''のように '' start() ''を連鎖できますか? –
はい、できますが、もしそうした場合、スレッドへの参照が失われているので、後でそのスレッドを停止することはできません。個人的には、私がしないことです。 –