2016-08-08 42 views
1

Dies ist eine vereinfachte Version des Programms, das PyQt Multithreading mit QObject.moveToThread implementiert. Grundsätzlich frage ich eine Webseite in einem separaten Thread ab und extrahiere den HMTL-Inhalt."QThread: Zerstört, während der Thread noch läuft" bei der Ausführung von Windows-Cmd oder IDLE, aber nicht von PyCharm?

Ich bekomme dieses Problem, wenn der Code von IDLE oder der Windows-Befehlszeile hängt Python. Der Windows-Cmd zeigt "QThread: Zerstört, während der Thread noch läuft". Wenn ich es jedoch von PYCHARM aus starte, funktioniert alles einwandfrei.

Sie können die .ui Datei here

Irgendwelche Ideen?

import requests 
import sys 
from PyQt4 import QtGui, uic 
from PyQt4.QtCore import QObject, pyqtSlot, pyqtSignal, QThread 


qtCreatorFile = "window.ui" 
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 


class HttpClient(QObject): 

    finished = pyqtSignal(str) 

    def __init__(self): 
     QObject.__init__(self) 

    @pyqtSlot() 
    def retrieve_page(self, url): 
     response = requests.get(url) 
     self.finished.emit(response.text) 


class HtmlGetter(QtGui.QMainWindow, Ui_MainWindow): 

    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     Ui_MainWindow.__init__(self) 
     self.setupUi(self)  
     self.go_button.clicked.connect(self.query_page) 

    def query_page(self): 
     http_client = HttpClient() 
     temp_thread = QThread() 
     http_client.moveToThread(temp_thread) 

     temp_thread.started.connect(
     lambda: http_client.retrieve_page("http://www.google.com/")) 
     http_client.finished.connect(self.show_html) 

     # Terminating thread gracefully. 
     http_client.finished.connect(temp_thread.quit) 
     http_client.finished.connect(http_client.deleteLater) 
     temp_thread.finished.connect(temp_thread.deleteLater) 

     temp_thread.start() 

    def show_html(self, html_text): 
     print(html_text) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    window = HtmlGetter() 
    window.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 
+0

Ich bekomme dieses Problem auch immer dann, wenn ich Multithread-Programme unter Windows ausführe, vor allem, wenn ich versuche, es mit Ctrl-C zu beenden. –

Antwort

1

ich es herausgefunden:

Beide http_client und temp_thread müssen Attribute oder die HtmlGetter Klasse sein. Ich denke es liegt daran, dass Python sie sonst beim Verlassen der Funktion verwirft. Dies ist der Arbeitscode: