2

Python プラットフォームでカスタマイズされたメディア プレーヤーを開発する学校のプロジェクトに取り組んでいます。問題は、time.sleep(duration) を使用すると、GUI のメイン ループがブロックされ、更新が妨げられることです。スーパーバイザーに相談したところ、マルチスレッドを使用するように言われましたが、スレッドの使用方法がわかりません。以下のシナリオでスレッド化を実装する方法について誰かアドバイスしてくれませんか?


コード:

def load_playlist(self, event):
    playlist = ["D:\Videos\test1.mp4", "D:\Videos\test2.avi"]
    for path in playlist:
        #calculate each media file duration
        ffmpeg_command = ['C:\\MPlayer-rtm-svn-31170\\ffmpeg.exe', '-i' , path]

        pipe = subprocess.Popen(ffmpeg_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        results = pipe.communicate()

        #Regular expression to get the duration
        length_regexp = 'Duration: (\d{2}):(\d{2}):(\d{2})\.\d+,'
        re_length = re.compile(length_regexp)

        # find the matches using the regexp that to compare with the buffer/string
        matches = re_length.search(str(results))
        #print matches

        hour = matches.group(1)
        minute = matches.group(2)
        second = matches.group(3)

        #Converting to second
        hour_to_second = int(hour) * 60 * 60
        minute_to_second = int(minute) * 60
        second_to_second = int(second)

        num_second = hour_to_second + minute_to_second + second_to_second
        print num_second

        #Play the media file
        trackPath = '"%s"' % path.replace("\\", "/")
        self.mplayer.Loadfile(trackPath)

        #Sleep for the duration of second(s) for the video before jumping to another video
        time.sleep(num_second) #THIS IS THE PROBLEM#
4

2 に答える 2

7

おそらく、スレッド、キュー、およびその他の楽しいものの使用例がいくつかある wxPython wiki を参照することをお勧めします。

このテーマに関するチュートリアルもここに書きました: http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

注意すべき主なことは、スレッドを使用する場合、wx メソッド (つまり、myWidget.SetValue など) を直接呼び出すことができないということです。代わりに、wxPython スレッドセーフ メソッドのいずれかを使用する必要があります: wx.CallAfter、wx.CallLater、または wx.PostEvent

于 2013-01-16T14:35:57.763 に答える
4

他のマルチスレッドの例と同様に、新しいスレッドを開始します。

from threading import Thread

# in caller code, start a new thread
Thread(target=load_playlist).start()

ただし、wx の呼び出しがスレッド間通信を処理する必要があることを確認する必要があります。この新しいスレッドから wx-code を呼び出すことはできません。セグメンテーションになります。したがって、次を使用しますwx.CallAfter

# in load_playlist, you have to synchronize your wx calls
wx.CallAfter(self.mplayer.Loadfile, trackPath)
于 2013-01-16T07:56:58.173 に答える