2017-12-05 7 views
3

ボタンをクリックしてボタンを作成してマルチプロセッシングを実行しようとしましたが、PyQtからマルチプロセッシングを正しく実行するにはどうすればよいですか?

がUIにブロックされます。私はバックゴンドでプロセスを実行することを願っています。私はそれを修正するにはどうすればよい

from PySide2 import QtCore,QtGui,QtWidgets 
import sys 
import multiprocessing 
from threading import Timer 
class TTT(multiprocessing.Process): 
    def __init__(self): 
     super(TTT, self).__init__() 
     self.daemon = True 
    def run(self): 
     while True: 
      t = Timer(5, self.doSomething) 
      t.start() 
      t.join() 

    def doSomething(self): 
     try: 
      print('123') 
     except Exception as e: 
      print(e) 

class MainWindow(QtWidgets.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     btn = QtWidgets.QPushButton('run process') 
     btn.clicked.connect(self.create_process) 
     self.setCentralWidget(btn) 

    def create_process(self): 
     QtWidgets.QMessageBox.information(self,'hhh','hhh') 
     t = TTT() 
     t.start() 
     t.join() 

if __name__=="__main__": 
    app=QtWidgets.QApplication(sys.argv) 
    ex = MainWindow() 
    ex.show() 
    sys.exit(app.exec_()) 
+0

Qtフレームワークを使用している場合は、Qtと標準のPythonを混ぜる代わりに、Qtの機能を使用することをお勧めします。信号とthredingはQtで私のために素晴らしいようです:) –

+0

あなたはQThreadを使用することを意味しますか? –

+0

QThreadは単なるオプションの1つです。 –

答えて

1

私はマルチプロセッシングを使用したことがないが、それが終了するまで、ドキュメントはjoin()メソッドブロックの発信者と言います。メソッドを無限ループに置くと、呼び出し元(UI)が永遠にブロックされます。

+1

私は数秒後にそれを書きました:)はい、あなたの例ではプロセスが終了せず、終了を待っています。 –

+0

ha、愚かな事を申し訳ありません... damm –

+0

@Relax ZeroC Btw私が言ったように、QThreadsの使用をチェックします。異なるプロセスでの作業は苦痛です。あなたは共有メモリを持っていない、あなたはTTTなどの変数を単純に変更することはできません。 –

1

BendegúzSzatmáriはすでに主な質問に答えています。

私は、プロセスの使用がほとんどの使用法では最良のアイデアではないことをお知らせしたいと思います。 異なるプロセスは、プログラムとメモリを共有しません。異なるスレッドとして簡単に制御することはできません。

これは簡単な例です。開始方法別のスレッドを停止します。

from PyQt5 import QtWidgets 
from PyQt5.QtCore import * 
import sys 
import time 


class TTT(QThread): 
    def __init__(self): 
     super(TTT, self).__init__() 
     self.quit_flag = False 

    def run(self): 
     while True: 
      if not self.quit_flag: 
       self.doSomething() 
       time.sleep(1) 
      else: 
       break 

     self.quit() 
     self.wait() 

    def doSomething(self): 
     print('123') 


class MainWindow(QtWidgets.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.btn = QtWidgets.QPushButton('run process') 
     self.btn.clicked.connect(self.create_process) 
     self.setCentralWidget(self.btn) 

    def create_process(self): 
     if self.btn.text() == "run process": 
      print("Started") 
      self.btn.setText("stop process") 
      self.t = TTT() 
      self.t.start() 
     else: 
      self.t.quit_flag = True 
      print("Stop sent") 
      self.t.wait() 
      print("Stopped") 
      self.btn.setText("run process") 


if __name__=="__main__": 
    app=QtWidgets.QApplication(sys.argv) 
    ex = MainWindow() 
    ex.show() 
    sys.exit(app.exec_()) 
+0

ありがとう、たくさんの@エリックŠťastný!しかし私の理由は、私はCPUに縛られたタスクを持っているので、私はマルチプロセッシングを使うべきだと思います。 –

+0

@RelaxZeroCこれをチェックしてください:https://stackoverflow.com/questions/617787/why-should-i-use-a-thread- vs-using-a-processを使用します。私はハードウェア、遅いフラッシュメモリなどで作業しますが、一部の機能が完了するまでに30秒かかる場合でも、単純なスレッドの代わりに別のプロセスを使用することはありませんでした。 –

関連する問題