Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Разработка GUI > [PyQt4] Thread метод run и start


Автор: necrozyablo 11.5.2010, 17:58
Не могу понять как запускать несколько копий одной нити. через метод start() Пока не завершится первая нить вторая не стартует при этом исключений тоже ни каких не выдаёт, т.е. по сути если 
сделать Test.start() и сразу ещё раз Test.start() то запустится только одна нить и один раз. 
Если же вызывать через Test.run() то тогда нормально будет вызываться две параллельных нити.

Вот у меня такой код:

Код

from functions import Test

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.lock = QReadWriteLock()
        self.num=[6,8]
        self.Test = Test(self.lock, self)
        self.Test2 = Test2(self.lock, self)
        self.connect(self.Test, SIGNAL("indexed(int)"), self.log_frame_deb3)
        self.connect(self.ui.DebugButton, QtCore.SIGNAL("clicked()"), self.log_frame_deb)

    def log_frame_deb3(self, fstatus):

        self.num[0]=fstatus
        
    def log_frame_deb(self):
  
        self.Test.start()
        self.Test.start()
        #self.Test.run()
        #self.Test2.start()
        print self.num

class Test(QThread):

    def __init__(self, lock, parent=None):
        super(Test, self).__init__(parent)
        self.lock = lock
        self.mutex = QMutex()    
        self.num=parent.num
        print 'init test qthread'
        
    def method3(self):

        self.mutex.lock();  
        
        try:
            self.lock.lockForWrite()
            self.num[0] *= 5;
            time.sleep(1.5)
            self.num[0] /= 4;
        finally:
            self.lock.unlock()   

        self.mutex.unlock();
        
    
    def run(self):
        self.method3()
        self.emit(SIGNAL("indexed(int)"), self.num[0])        

       
Вообще здесь нажимеам на DebugButton срабатывает  log_frame_deb в нём у меня запускаются Threds Test и Test они делают emit 'indexed(int)' в log_frame_deb3
В документации сказано 
Цитата

QThread.start (self, Priority priority = QThread.InheritPriority)

This method is also a Qt slot with the C++ signature void start(QThread::Priority = QThread.InheritPriority).

Begins execution of the thread by calling run(), which should be reimplemented in a QThread subclass to contain your code. The operating system will schedule the thread according to the priority parameter. If the thread is already running, this function does nothing.


Т.е. по идеи как раз правильно что при работе Нити не запускается её копия? Но я видел примеры где Нити копиями стартуют или там есть какая то хитрость?

Вот конкретно в том коде что я написал есть ещё одна особенность это self.mutex = QMutex()  от него не холодно не жарко чисто с ним копии тредов шли в параллель без локанья переменной self.num и на выходе из 6 получалось
6*5*5/4/4 для int это 9
а если выполнять lock то должно получится
6*5/4*5/4 = 8
В этом плане у меня всё нормально заработало когда я ввёл self.lock.lockForWrite()  
Не могу понять как нужно было использовать QMutex()  что с ним всё локалось и анлокалось.

Автор: pkad 12.5.2010, 15:58
Совет.
Если вопрос по запуску нитей, напиши маленький тест, который посвящен только этому вопросу, а не вываливай кучу кода, 95% которого не имеет отношения к вопросу. Это облегчит жизнь и тебе и людям, которые будут разбираться в твоем коде.
Насколько я вижу ты создаешь две нити:

Цитата

self.Test = Test(self.lock, self)
self.Test2 = Test2(self.lock, self)


Класс Test я вижу, а Test2 - нет. Ну ладно. Непонятно другое, почему создав две нити, ты пытаешься два раза запустить одну и ту же:

Цитата

self.Test.start()
self.Test.start()


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)