PyQt中的线程处理

3

我正在开发一款软件,其中包括一个虚拟钢琴,可以通过midi键盘进行控制。 我想要做的是创建一个线程来监视midi输入,当有数据到达时触发相应的处理(例如播放声音和动画按键)。如何使用Qt线程和事件实现这一功能?


创建一个线程。发射一个信号。如果您需要更详细的答案,您需要更具体地说明您尝试了什么以及哪些部分不起作用,而不是要求提供有关如何使用QThreads和信号的完整通用示例。 - jdi
我有一些按钮作为我的钢琴键。我已经编写了一个程序,使用计算机键盘来演奏这些键。现在我需要使用我的MIDI键盘来演奏它。所以现在我已经完成了按下一个键后,程序将进入MIDI读取循环,然后触发相应的操作。但是这里程序的其他Qt函数没有被执行。因此,我想实现一个单独的事件,在MIDI端口中有数据时发出信号。我该如何在PyQt中实现? - Hemanth Raveendran
2个回答

3
以下是关于如何使用自定义信号的好文章:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html

这里还有一个页面展示如何使用QThread: http://joplaete.wordpress.com/2010/07/21/threading-with-pyqt4/

以上内容基本涵盖了你所需要的。你可以创建一个带有run()函数的QThread,该函数将循环并监视你的midi端口,然后发出自定义信号。你可以在应用程序启动时启动此线程。你可以将QThread的自定义信号连接到主应用程序或任何应该被通知的小部件上的处理程序。


0

这里有一个小例子:

import time
import sys

from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import SIGNAL, QObject


class DoSomething(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)

    def run(self):
        time.sleep(3)
        self.emit(SIGNAL('some_signal'))


def signalHandler():
    # We got signal!
    print 'Got signal!'
    sys.exit(0)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    # Create new thread object.
    d = DoSomething()

    # Connect signalHandler function with some_signal which 
    # will be emited by d thread object.
    QObject.connect(d, SIGNAL('some_signal'), signalHandler, QtCore.Qt.QueuedConnection)

    # Start new thread.
    d.start()

    app.exec_()

这是旧式的信号槽。你应该尝试将其更新为更具Python风格的新版本。 - jdi
好的,我明白了。感谢您在回答中提供的链接。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接