Потоки в PyQt

Я разрабатываю программное обеспечение с виртуальным пианино, которым можно управлять с помощью миди-клавиатуры. То, что я пытаюсь сделать, это то, что мне нужен поток, наблюдающий за входами midi, и когда поступают данные, соответствующий процесс должен запускаться (здесь воспроизводится звук и анимируется клавиша). Как я могу сделать это с Qt Threading и событиями?


person Hemanth Raveendran    schedule 23.03.2012    source источник
comment
Создайте тему. Издать сигнал. Если вам нужен более подробный ответ, вам нужно будет более конкретно указать, что вы пробовали и что не работает, а не запрашивать полный общий пример того, как использовать QThreads и сигналы.   -  person jdi    schedule 23.03.2012
comment
У меня есть несколько кнопок вместо клавиш пианино. И я сделал программу, которая компьютерная клавиатура используется для игры на этих клавишах. И теперь я должен сыграть это на своей миди-клавиатуре. Итак, теперь я сделал это, так как при нажатии клавиши программа будет входить в цикл чтения миди, а затем запускать соответствующее действие. Но здесь другие функции Qt программы не выполняются. Поэтому я просто хотел реализовать отдельное событие, которое излучает сигнал, когда в миди-порте есть данные. Как я могу сделать с PyQt?   -  person Hemanth Raveendran    schedule 23.03.2012


Ответы (2)


Вот хорошая страница о том, как использовать пользовательские сигналы: 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/

Это почти все, что вам нужно. Вы создаете QThread с функцией run(), которая будет зацикливать и контролировать ваш миди-порт, а затем выдавать пользовательский сигнал. Вы бы начали этот поток с запуска вашего приложения. И вы должны подключить пользовательский сигнал QThread, который вы создали, к обработчикам в вашем основном приложении или к любому виджету, который должен быть уведомлен.

person jdi    schedule 23.03.2012

Вот вам небольшой пример:

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_()
person Adam    schedule 23.03.2012
comment
Это сигнальный слот старого стиля. Вы должны попробовать обновить это до новой, более питонической версии. - person jdi; 24.03.2012
comment
Да я вижу. Спасибо за ссылки в вашем ответе. - person Adam; 24.03.2012