线程:PyQt4的动态GUI刷新和速度问题

时间:2015-05-31 01:32:04

标签: multithreading pyqt

playThread向movePhead()发出信号以移动播放头。这是平滑更新的,直到需要DynamicThread,这需要在播放过程中进行大量处理,例如在GUI中移动和创建对象。

创建DynamicThread时会发生两件事:

  1. 在正在处理

  2. 时,间歇性地播放减慢速度
  3. DynamicThread处理完毕后,屏幕停止更新 自动,仅在滚动关闭然后重新开启时更新。

  4. 我在每个过程中的不同点尝试了以下操作但没有结果:

    • app.processEvents(),update()和repaint()

    • 通过制作对主窗口中的数据结构的所有调用 全局在DynamicThread的run()函数

    我是线程新手,所以可能存在一个简单的结构问题。

    请告诉我可能遗失的内容。

    我使用的是开源音序器模板:https://github.com/rhetr/seq-gui

    def movePhead(x):
        playHead.setPos(QtCore.QPointF(x, 0))
        y = main.view.verticalScrollBar().sliderPosition() + 125
    
        main.view.centerOn(x, y)
    
    class DynamicThread(QtCore.QThread):
        def __init__(self, v1, v2, v3, v4, v5):
            super(DynamiteThread , self).__init__()
            self.signal = QtCore.SIGNAL("signal")
            self.v1, self.v2, self.v3, self.v4, self.v5 = v1, v2, v3, v4, v5
            self.start()
    
        def stop(self):
            self.terminate()
    
        def run(self):
            self.process(self.v1, self.v2, self.v3, self.v4, self.v5)
            self.stop()
    
    class PlayThread(QtCore.QThread):
        def __init__(self):
            super(PlayThread , self).__init__()
            self.signal = QtCore.SIGNAL("signal")
    
        def stop(self):
            self.terminate()
    
        def run(self):
            global xLocToNoteItems
            global xLocToRhythms
            global currentLLindex
    
            for xloc in xrange(currentLLindex + 1, len(orderedXlocations)):
                currentLLindex = xloc
                for noteItem in xLocToNoteItems[orderedXlocations[xloc]]:
                    player.note_on(noteItem.note[0], noteItem.note[3], 1)
    
                self.emit(self.signal, orderedXlocations[xloc] - 31.5)
    
                offtime = xLocToRhythms[orderedXlocations[xloc]]
                time.sleep(offtime / 2.0)
    
                for noteItem in xLocToNoteItems[orderedXlocations[xloc]]:
                    player.note_off(noteItem.note[0], noteItem.note[3], 1)
    

0 个答案:

没有答案