0

PySide を使用して Python でアプリケーションを構築しています。Python シェルを使用して制御できるハードウェアをエミュレートする GUI があります。2 つのプロセス間のキューを監視する独自のスレッドを作成する別のプロセスで GUI を開始しました。メイン プロセスはコマンドをキューに入れ、キュー モニタ スレッドはコマンドが受信されるまで GUI プロセス ブロックに入れます。キュー モニター スレッドは、GUI に信号を送信して更新します。

問題は、キュー モニター スレッドが開始されていないことです。

メインプロセスの関連コードは次のとおりです。

def init():
    proc_comms_q_to_em = Queue()
    proc_comms_q_from_em = Queue()
    emulator = Process(
        target=run_emulator,
        args=(sys.argv, proc_comms_q_to_em, proc_comms_q_from_em))
    emulator.start()
    sleep(1)
    proc_comms_q_to_em.put(('message', 'test'))
    print("q to em size", proc_comms_q_to_em.qsize())

エミュレーター (GUI) プロセス:

class InterfaceMessageHandler(QObject):
    def __init__(self, app, q_to_em, q_from_em):
        super().__init__()
        self.main_app = app
        self.q_to_em = q_to_em
        self.q_from_em = q_from_em

    def check_queue(self):
        print("Checking queue")
        while True:
            print("Waiting for action")
            action = self.q_to_em.get()
            # emit signal so that gui gets updated


def start_interface_message_handler(
        app, emu_window, proc_comms_q_to_em, proc_comms_q_from_em):
    # need to spawn a worker thread that watches the proc_comms_q
    # need to seperate queue function from queue thread
    # http://stackoverflow.com/questions/4323678/threading-and-signals-problem
    # -in-pyqt
    intface_msg_hand_thread = QThread()
    intface_msg_hand = InterfaceMessageHandler(
        app, proc_comms_q_to_em, proc_comms_q_from_em)
    intface_msg_hand.moveToThread(intface_msg_hand_thread)
    intface_msg_hand_thread.started.connect(intface_msg_hand.check_queue)

    # connect some things to emu_window

    def about_to_quit():
        intface_msg_hand_thread.quit()
    app.aboutToQuit.connect(about_to_quit)

    intface_msg_hand_thread.start()
    print("started msg handler")


def run_emulator(
        sysargv, proc_comms_q_to_em, proc_comms_q_from_em):
    app = QApplication(sysargv)

    emu_window = EmulatorWindow()

    print("gui: Starting interface message handler")
    start_interface_message_handler(
        app, emu_window, proc_comms_q_to_em, proc_comms_q_from_em)

    print("gui: showing window")
    emu_window.show()
    app.exec_()

init 関数を実行すると、次のようになります。

gui: Starting interface message handler
started msg handler
gui: showing window
q to em size 1

エミュレータ ウィンドウが表示されますが、「チェック キュー」が表示されません。

このコードと同じ方法で開始しました: https://github.com/piface/pifacedigital-emulator/blob/testing/pifacedigital_emulator/gui.py#L442

私が気をつけなければならない落とし穴はありますか?これは、プロセス/スレッド/QT 間の正しい通信方法ですか?

4

0 に答える 0