マルチプロセッシングを追加すると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 スキーマ
そしてここ:
どんな助けでも大歓迎です。