繁体   English   中英

Python线程,一个接一个地加载

[英]Python Threading, loading one thread after another

我正在使用媒体播放器,并且能够加载单个.wav并进行播放。 如下面的代码所示。

  foo = wx.FileDialog(self, message="Open a .wav file...", defaultDir=os.getcwd(), defaultFile="", style=wx.FD_MULTIPLE)
  foo.ShowModal()

  queue = foo.GetPaths()

  self.playing_thread = threading.Thread(target=self.playFile, args=(queue[0], 'msg'))
  self.playing_thread.start()

但是问题是,当我尝试将上述代码放入多个.wav文件的循环中时。 这样,当play_thread.isActive == True时,创建并.start()线程。 然后,如果.isActive == False,则弹出队列[0]并加载下一个.wav文件。 问题是,我的UI将被锁定,我将不得不终止该程序。 任何想法,将不胜感激。

由于使用的是wx.python,因此请使用Delayedresult,请查看wx演示以获取完整示例。

完整的最小示例:

import wx
import wx.lib.delayedresult as inbg
import time

class Player(wx.Frame):
    def __init__(self):


    self.titulo = "Music Player"
    wx.Frame.__init__(self, None, -1, self.titulo,)
    self.jobID = 0
    self.Vb = wx.BoxSizer(wx.VERTICAL)
    self.panel = wx.Panel(self,-1)
    self.playlist = ['one','two']
    self.abortEvent = inbg.AbortEvent()
    self.msg = wx.StaticText(self.panel, -1, "...",pos=(30,-1))
    self.msg.SetFont(wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD))
    self.action = wx.Button(self.panel, -1,"Play Playlist")
    self.Bind(wx.EVT_BUTTON, self.StartPlaying,self.action)

    self.Vb.Add(self.msg, 0, wx.EXPAND|wx.ALL, 3)
    self.Vb.Add(self.action, 0, wx.EXPAND|wx.ALL, 3)
    self.panel.SetSizer(self.Vb)
    self.Show()


def StartPlaying(self,evt):
    self.BgProcess(self.Playme)


def Playme(self,jobID, abortEvent):
    print "in bg"
    list = self.getPlayList()
    print list
    for music in list:

        self.msg.SetLabel('Playing: %s' % music)
        stop = 100
        while stop > 0:
            print stop
            stop -=1
            self.msg.SetLabel('Playing: %s [%s ]' % (music,stop))






def _resultConsumer(self, inbg):
    jobID = inbg.getJobID()
    try:
        result = inbg.get()
        return result
    except Exception, exc:
        return False

def getPlayList(self):
    return self.playlist

def setPlayList(self,music):
    self.playlist.appdend(music)



def BgProcess(self,executar):
    self.abortEvent.clear()
    self.jobID += 1
    inbg.startWorker(self._resultConsumer, executar, wargs=(self.jobID,self.abortEvent), jobID=self.jobID)  



app  = wx.App(False)
demo = Player()
app.MainLoop()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM