Russian Qt Forum

Qt => Общие вопросы => Тема начата: Sokoloff от Октябрь 25, 2009, 11:38



Название: Запуск QProcess из QThread
Отправлено: Sokoloff от Октябрь 25, 2009, 11:38
Не могу до конца понять как запустить процесс (QProcess) из потока. Написал так:
Код
Python
class MyThread(QThread):
   #****************************************************************
   #
   #****************************************************************
   def __init__(self, fileName):
       QThread.__init__(self)
       self._fileName = QString(fileName)
 
 
   #****************************************************************
   #
   #****************************************************************
   def run(self):
       args = QStringList()
       args << self._fileName
 
       proc = QProcess()
       proc.start(QString('ls'), args)
       if not proc.waitForStarted(5000):
           print "Error starting"
           return
 
       proc.waitForFinished(-1)
       print QString(proc.readAllStandardOutput())
       del proc
 

Запускаю 2 потока,
Код
Python
   def start(self):
       while (1):
       th1 = MyThread('/home')
       th1.start()
 
       th2 = MyThread('/boot')
       th2.start()
 
       time.sleep(1)
 

Потоки запускаются, отображают листинги. Но через некоторое количество итераций, один из процессов не может стартовать, т.е. метод proc.waitForStarted(5000) отваливается по таймауту. Перечитал документацию, и не могу понять, я что-то неправильно делаю, это глюк в PyQt, или глюк на моей конкретной машине?

Еще прочитал, что для работы в QThread нужно запустить "event loop" с помощью exec(), но куда его вставить? Если до моего кода, то до кода собственно дело и не дойдет ("event loop"  будет крутиться до exit-а), а если после создания QProcess, то ошибка произойдет до вызова exec. Или в данном случае "event loop" не причем?

P.S. Пример демонстрационный.

Kubuntu 9.04, libqt4-dev - 4.5.2, python-qt4 - 4.5.4


Название: Re: Запуск QProcess из QThread
Отправлено: BRE от Октябрь 25, 2009, 12:18
Сделал подобный пример:
Код
Python
#!/usr/bin/python                    
# coding: utf-8                      
import sys                            
import time                          
from PyQt4.QtCore import *            
 
class MyThread(QThread):
       def __init__(self, fileName):
               QThread.__init__(self)
               self._fileName = QString(fileName)
 
       def run(self):
               args = QStringList()
               args << self._fileName
 
               proc = QProcess()
               proc.start(QString('ls'), args)
               if not proc.waitForStarted(5000):
                       print "Error starting"
                       return
 
               proc.waitForFinished(-1)
               print QString(proc.readAllStandardOutput())
               del proc
 
def main():
       cnt = 0
       while( 1 ):
               th1 = MyThread('/home')
               th1.start()
 
               th2 = MyThread('/boot')
               th2.start()
 
               th1.wait()
               th2.wait()
 
               del th1
               del th2
 
               cnt = cnt + 1
               print( "Count %d" % cnt )
 
               time.sleep( 1 )
 
main()
 

Подождал минуты 3, все крутиться.

Цитировать
Потоки запускаются, отображают листинги. Но через некоторое количество итераций, один из процессов не может стартовать
Сколько итераций нужно ждать?


Название: Re: Запуск QProcess из QThread
Отправлено: Sokoloff от Октябрь 25, 2009, 20:27

Подождал минуты 3, все крутиться.
Сколько итераций нужно ждать?
У меня отваливается секунд через 30.
Какие у тебя дистрибутив, Qt и PyQt?

Т.е. код правильный?


Название: Re: Запуск QProcess из QThread
Отправлено: BRE от Октябрь 25, 2009, 20:33
Какие у тебя дистрибутив, Qt и PyQt?
qt-4.5.2-3.fc10.i386
PyQt4-4.5.4-1.fc10.i386


Название: Re: Запуск QProcess из QThread
Отправлено: Sokoloff от Октябрь 26, 2009, 01:25
Спасибо