Многопоточность PyQt4 с использованием QThread - PullRequest
0 голосов
/ 14 апреля 2011

Существует бесконечный блок при вызове функции xml.etree.ElementTree.fromstring() в QThread. Также много других вызовов делает QThread заблокированным как multiprocessing.Process(). Важно сказать, что это чистый блок, без исключений или разрывов.

Вот код (немного отредактированный, но тот же принцип, что и у источника):

from PyQt4.QtGui import *
from Ui_mainwindow import Ui_MainWindow
import sys
import xml.etree

class Bruton(QThread):
    def __init__(self, mw):
        super(Bruton, self).__init__(mw) 
        self.mw = mw

    def run(self):
        print("This message I see.")
        tree = xml.etree.ElementTree.fromstring("<element>text</element>")
        print("But this one never.")

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.init_bruton()

    # When the form is shown...
    def showEvent(self, arg1):
        self.bruton.start()

    def init_bruton(self):
        self.bruton = Bruton(self)

app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec_())

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

Код, который был опубликован, на самом деле не запускается, но с небольшими изменениями он работает и работает нормально.Вот код с изменениями:

from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
import xml.etree.ElementTree

class Bruton(QThread):
    def __init__(self, mw):
        super(Bruton, self).__init__(mw)
        self.mw = mw

    def run(self):
        print("This message I see.")
        tree = xml.etree.ElementTree.fromstring("<element>text</element>")
        print("But this one never.")

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.init_bruton()

    # When the form is shown...
    def showEvent(self, arg1):
        self.bruton.start()

    def init_bruton(self):
        self.bruton = Bruton(self)

app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec_())

А вот и вывод:

$ python test.py 
This message I see.
But this one never.

Это с Python 2.6.6, PyQt4 4.8.3, в Debian Unstable.

Можете ли вы попробовать это в своей среде и посмотреть, работает ли мой модифицированный пример для вас?Если это так, вы находитесь на пути к решению для вашего реального кода.=)

0 голосов
/ 15 апреля 2011

Код, который я здесь показал, сокращен (источник разделен на два файла и __ini__.py).Я заметил, что основным модулем должен быть модуль, который запускает QApplication.Поэтому я добавил app.exec_() к __init__.py, который является основным модулем моей программы.

...