2016-07-21 18 views
0

Ich möchte das tun: Es gibt eine Klasse namens 'Main'. Es gibt eine andere Klasse namens'Class '. Und es gibt eine dritte Klasse namens "Thread". Es ist unsere Thread-Klasse. 'Main' ist unsere Hauptklasse und wir starten unsere Thread-Klasse aus der Main-Klasse. Wenn unsere Thread-Klasse gestartet wird, gibt sie ein Signal von der run() -Funktion aus ... 'Main' und 'aClass' Klassen versuchen, diese Signale abzufangen. 'Main' Klasse ist in der Lage, das Signal, das von der Thread-Klasse ausgegeben wurde, abzufangen, aber 'aClass' kann nicht dasselbe Signal empfangen, weil ich QThread nicht von 'aClass' gestartet habe. Ich habe es nur in 'aClass' definiert.Wie sende ich das gleiche Signal für 2 Klassen von QThread

Hier sind Codes:

#!/usr/bin/env python 

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
import sys 


class Main(QMainWindow): 
    def __init__(self): 
     QMainWindow.__init__(self) 

     self.setWindowTitle("Test") 
     self.aClass = aClass() 

     self.thread = Thread() 
     self.thread.printMessage.connect(self.write) 
     self.initUI() 

    def initUI(self): 
     self.button = QPushButton("Start Process", self) 
     self.button.clicked.connect(self.startProcess) 

    def startProcess(self): 
     self.thread.start() 

    def terminateProcess(self): 
     self.thread.terminate() 

    def write(self): 
     print "Main: hello world..." 


class aClass(object): 
    def __init__(self): 
     print "aClass: I have been started..." 
     self.thread = Thread() 
     self.thread.printMessage.connect(self.write) 

    def write(self): 
     print "aClass: hello world..." 

class Thread(QThread): 
    printMessage = pyqtSignal() 

    def __init__(self): 
     QThread.__init__(self) 
     print "Thread: I have been started..." 

    def run(self): 

     self.printMessage.emit() 
     print "Thread: I emitted the message." 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    root = Main() 
    root.show() 
    app.exec_() 

Das Ergebnis: Wenn das Programm startet, ist die Ausgabe: 'Start-Prozess' Taste

aClass: I have been started... 
Thread: I have been started... 
Thread: I have been started... 

Wenn ich auf klicken, wird die Ausgabe lautet:

Thread: I emitted the message. 
Main: hello world... 

Gesamtleistung:

aClass: I have been started... 
Thread: I have been started... 
Thread: I have been started... 
Thread: I emitted the message. 
Main: hello world... 

Die Ausgabe, die ich zu bekommen, wenn ich ‚Prozess starten‘ klicken:

Thread: I emitted the message. 
Main: hello world... 
aClass: hello world... 

möchte ich dieses Ergebnis, aber ich will nicht von ‚aClass self.thread.start() Befehl verwenden 'weil ich will Thread ausgeführt nur für eine Zeit ...

+0

Sind Sie versuchen, das gleiche Signal aus dem gleichen Thread zu bekommen? –

+0

Ja. Mein Problem ist gelöst. – PIC16F84A

Antwort

0

Was Sie tun, ist eine zweites Thread im aClass Objekt zu schaffen, die nicht die gleichen Thread wie im Main ist. Sie müssen das Signal von self.thread in Main mit dem Steckplatz write in Ihrem self.aClass Objekt verbinden.

Sie wollen diese stattdessen tun:

class Main(QMainWindow): 
    def __init__(self): 
     QMainWindow.__init__(self) 

     self.setWindowTitle("Test") 
     self.aClass = aClass() 

     self.thread = Thread() 
     self.thread.printMessage.connect(self.write) 
     self.thread.printMessage.connect(self.aClass.write) 


... 

class aClass(object): 
    def __init__(self): 
     print "aClass: I have been started..." 
     #self.thread = Thread() #This makes a new Thread 
     #self.thread.printMessage.connect(self.write) 

    def write(self): 
     print "aClass: hello world..." 
     self.initUI() 
+1

Sie können auch 'self.thread' als Argument von' aClass .__ init__' angeben, um die aktuelle 'connect'-Zeile beizubehalten. – Frodon

+0

Danke an alle. Mein Problem ist gelöst ... – PIC16F84A