0

マルチプロセッシングを追加するとGUIが更新されないのに、次のPyQtシグナル/スロット設定が機能する理由について何か考えがあるかどうか疑問に思っていました。どちらの場合も信号は送信されますが、信号/スロットは GUI を更新できますが、マルチプロセッシング レイアウトは更新できません。

これが私が持っている一般的なセットアップです: PyQt シグナルとスロットの場合、これは機能します:

# signals and slots 
class Worker(QObject):
    ...
    # send signals in for loop to tab
    ...

class Tab(QTabWidget):
    ...
    # start thread
    ...
    # get signals and update GUI

class MainWindow:
    ...
    # make GUI stuff
    ...
    # start worker process

このマルチプロセッシング コードは次のことを行いません。

# signals and slots *with multiprocessing*
class Worker(QObject):
    ...
    # send messages down a pipe in for loop to tab
    ...
class Worker_thread(QThread):
    ...
    # start process
    ...
    # get messages from Worker and send signals to update GUI function in Tab

class Tab(QTabWidget):
    ...
    # start Worker_Thread
    ...
    # get signals and update GUI

class MainWindow:
    ...
    # make GUI stuff
    ...
    # start Worker_thread process

マルチプロセッシングの場合にワーカーからメッセージを取得し、信号を送信して GUI を更新する関数を次に示します。

@QtCore.pyqtSlot()
def start_computation(self):
    self.process.start()
    while(True):
        try:
            message = self.consumer.recv()
            self.update_signal.emit(message)
        except EOFError:
            pass
        if message == 'done with processing':
            self.done_signal.emit()
            break
        #self.parent.update_GUI(message)
    self.process.join()
    return

Pipeここのどこかを閉じる必要がありますか?進行状況のプロセスを常に読み取り、GUI 全体を更新する必要があるため、どこでそれが適切かわかりません。

また、これの完全なコード例がいくつかあります。

「応答なし」ブロッキングに対処するためのマルチプロセッシング GUI スキーマ

そしてここ:

https://stackoverflow.com/questions/15754826/gui-not-responding-general-multithreading-and-multprocessing-architecture?lq=1

どんな助けでも大歓迎です。

4

0 に答える 0