如何使用python启动两个线程?

时间:2015-05-16 10:08:22

标签: python multithreading python-2.7 3d leap-motion

我有3个python文件:

  1. 文件包括许多类使用pyQt初始化Frame和其他GUI的任何方法。

  2. 文件,包括从跳跃运动中读取数据的Leap Motion Listener类。

  3. 用于启动其他类的主文件。

  4. 现在我想一起启动GUI框架和Leap Motion类。我试图在主类中启动两个线程但是存在很多问题。

    此代码仅在运行pyQt框架时有效:

    import sys
    from PyQt4 import QtCore, QtGui
    from Painter import GUI_animate
    
    class StartQT4(QtGui.QMainWindow):
    
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.ui = GUI_animate()
            self.ui.setupUi(self)
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        myapp = StartQT4()
        myapp.show()
        sys.exit(app.exec_())
    

    这就是我试图运行pyQt框架和Leap Motion类:

    import sys
    from PyQt4 import QtCore, QtGui
    from Painter import GUI_animate
    import LeapMotion
    from threading import Thread
    
    
    class StartQT4(QtGui.QMainWindow):
    
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
    
            t1 = Thread(target=show_frame())
            t2 = Thread(target=start_LeapMotion())
            t1.start()
            t2.start()
            self.ui.setupUi(self)
    
    def start_LeapMotion():
        LeapMotion.main()
    
    def show_frame():
        StartQT4.ui = GUI_animate()
    
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        myapp = StartQT4()
        myapp.show()
        sys.exit(app.exec_())
    

    但只有Leap Motion类运行,并且在完成从跳跃运动读取后,框架显示!

    我怎么能一起运行它们?

1 个答案:

答案 0 :(得分:4)

当您将show_framestart_LeapMotion指定为线程的target时,请不要将它们放在后面。 Python将functionName解释为引用<function functionName at (memory location)>的变量,而functionName()是对该函数的调用。当您指定线程的target时,您想要传递对该函数的调用;你想传递这个功能。正如API for the threading module中所解释的那样,t1.start()调用Thread对象的run()方法,除非你重写它,否则“调用传递给对象构造函数的可调用对象 target 参数“ - 请注意target参数应该接收一个可调用对象(即函数本身,所以没有括号),而不是一个调用(这是你当前正在传递的)。