2016-07-10 2 views
1

私はGUIの外で新しいスレッドワーカーを作成しようとしています。 QThreadをサブクラス化すると期待通りに動作しますが、GUIは影響を受けません。私がmoveToThread技術を使用すると、私はGUIの完全なロックアップを取得します。私は誤ってメインスレッドに新しいスレッドを入れていると仮定しますが、私はそれを引き起こすために何をしているのか分かりません。メインスレッドをフリーズせずにstart2関数をどのように動作させることができますか?このサブクラス化に必要な説明QThreadとmoveToThreadの例

from PySide import QtGui, QtCore 
import sys 
import time 

class THREAD(QtCore.QThread): 
    def __init__(self): 
     super(THREAD, self).__init__() 

    def run(self): 
     time.sleep(5) 
     print "done" 

class WORKER(QtCore.QObject): 
    def __init__(self): 
     super(WORKER, self).__init__() 

    def run(self): 
     time.sleep(5) 
     print "done" 

class GUI(QtGui.QDialog): 
    def __init__(self): 
     super(GUI, self).__init__() 

     mainLayout = QtGui.QHBoxLayout() 
     self.setLayout(mainLayout) 
     start1Button = QtGui.QPushButton("Start1") 
     start2Button = QtGui.QPushButton("Start2") 
     mainLayout.addWidget(start1Button) 
     mainLayout.addWidget(start2Button) 
     start1Button.clicked.connect(self.start1) 
     start2Button.clicked.connect(self.start2) 

    def start1(self): 
     self.myThread = THREAD() 
     self.myThread.start() 

    def start2(self): 
     myWorker = WORKER() 
     myThread = QtCore.QThread() 
     myThread.start() 
     myWorker.moveToThread(myThread) 
     myWorker.run() 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = GUI() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

答えて

0

はまず、あなたはそれ以外の場合は、ガベージコレクションとすぐstart2()としてリターンを得るでしょう、参照に労働者を維持し、あなたが作成したスレッドする必要があります。

myWorker.run()を直接start2()内に呼び出すと、メインスレッド内で実行されます。だから、スレッドが開始した後に、後で呼び出させるように手配しなければなりません。これを行う通常の方法は、信号を使用することです。

あなたのコードは、したがって、次のようになります。

def start2(self): 
     self.myWorker = WORKER() 
     self.myThread2 = QtCore.QThread() 
     self.myWorker.moveToThread(self.myThread2) 
     self.myThread2.started.connect(self.myWorker.run) 
     self.myThread2.start() 
+0

は素晴らしい、あなたがekhumoroありがとう! – bneall

関連する問題