PyQt: Как отправить сигнал остановки в поток, где объект выполняет условный цикл while?

Я делаю несколько многопоточности. У меня есть рабочий класс сwork метод, который я отправляю в отдельныйQThread,work у метода есть условный цикл while внутри. Я хочу иметь возможность отправить сигнал на рабочий объект, чтобы остановить его (изменение_running условие ложно). Это приведет к выходу из цикла while и к отправке готового сигнала от рабочего объекта (который подключен к слоту выхода рабочего потока).

Ложное условие отправляется рабочему объекту через сигнал, но оно никогда не принимается, что, как я полагаю, связано с тем, что цикл while блокирует цикл обработки событий своего потока. Даже если я положуQCoreApplication.processEvents() внутри цикла while ничего не происходит. В чем проблема? Почему сигнал не обрабатывается? (Обратите внимание, что оператор печати в стоп-слоте на Worker никогда не выполняется - но странно то, что поток действительно останавливается неправильно).

Вот код:

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

class Worker(QObject):
    sgnFinished = pyqtSignal()

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

        self._running = True

    @pyqtSlot()
    def stop():
        print 'stop signal received, switching while loop condition to false'
        self._running = False

    @pyqtSlot()    
    def work(self):
        while self._running:                 #this blocks the thread, if changed to an if clause, thread finishes as expected!
            QCoreApplication.processEvents() #this doesn't help!
            time.sleep(0.1)
            print 'doing work...'

        #do some cleanup here, then signal the worker is done
        self.sgnFinished.emit()


class Client(QObject):
    sgnStop = pyqtSignal()

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

        self._thread = None
        self._worker = None

    def toggle(self, enable):
        if enable:
            if not self._thread:
                self._thread = QThread()

            self._worker = Worker(None)
            self._worker.moveToThread(self._thread)

            self._worker.sgnFinished.connect(self.on_worker_done)
            self.sgnStop.connect(self._worker.stop)

            self._thread.started.connect(self._worker.work)
            self._thread.start()
        else:
            print 'sending stop signal to the worker object'
            self.sgnStop.emit() #send a queuedconnection type signal to the worker, because its in another thread

    @pyqtSlot() 
    def on_worker_done(self):
        print 'workers job was interrupted manually'
        self._thread.quit()
        #self._thread.wait() not sure this is neccessary

if __name__ == '__main__':
    app = QCoreApplication(sys.argv)

    client = Client(None)
    client.toggle(True)
    raw_input('Press something')
    client.toggle(False)

Ответы на вопрос(2)

Ваш ответ на вопрос