2015-01-16 2 views
0

У меня есть странная проблема с QThreads in (pyqt). Я протестировал QThread с внедрением метода , выполнив метод и выполнив бесконечный цикл внутри него. это не влияет на основную нить (gui). но когда я излучаю сигнал , как ниже псевдокода, любой длинный рабочий цикл или входы влияют на основную нить и заставляют замораживать gui.QThread без реализации метода запуска

class MyThread(QThread): 
    def __init__(self , *args): 
     QThread.__init__(self , *args) 
     self.connect(self , SIGNAL("do_some_io(QString)") , self.doSomething) 

    def doSomething(self , params): 
     #do some large i/o and loops 
     parent.emit(SIGNAL("process_done()")) 


class MyDialog(QDialog): 
    def __init__(self , *args): 
     QThread.__init__(self , *args) 
     self.Thread = MyThread(self) 
     self.Thread.start() 
     self.connect(self.btn , SIGNAL("clicked()") , self.buttonClicked) 
     self.connect(self , SIGNAL("process_done()") , self.showMsgBox) 

    def buttonClicked(self): 
     self.Thread.emit(SIGNAL("do_some_io(QString)") , "param") 

    def showMsgBox(self): 
     #show messagebox 
+0

Когда вы говорите Замораживание, вы имеете в виду всплеск, за несколько секунд, или, по-видимому навсегда? –

+0

он зависает до завершения ввода/вывода или любого процесса блокировки – SantaXYZ

+0

@SantaXYZ. Если вы понимаете, почему вам нужно переопределить 'run', и знаете, что он работает так, как ожидалось, то почему, черт возьми, вы его изменили? Чего вы на самом деле пытаетесь достичь? – ekhumoro

ответ

0

Это происходит потому, что, когда вы испускают do_some_io, doSomething выполняется в GUI потоке. В ваших вызовах соединения вам необходимо установить тип подключения на QueuedConnection. Это приведет к тому, что сообщение будет добавлено как событие в очередь событий принимающего потока, и затем будет запускать сигнал в принимающем потоке вместо отправляющего потока.

См: http://doc.qt.io/qt-5/qt.html#ConnectionType-enum

+0

спасибо. но я изменил метод подключения в ** MyThread **, например 'self.connect (self, SIGNAL (« do_some_io (QString) »), self.doSomething, Qt.QueuedConnection)' и все еще не работает. Я использую PyQt4 – SantaXYZ

+0

, конечно, у меня много звонков, подобных этому, но я сменил один из них и не работал (тот, который вызывает замораживание). – SantaXYZ

+0

спасибо. Я понял, что проблема заключается в обнаружении типа соединения с pyqt. но почему, когда я изменил свой тип соединения на 'QueuedConnection', он все еще не работает? – SantaXYZ