Russian Qt Forum
Октябрь 02, 2024, 05:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запуск QProcess из QThread  (Прочитано 4349 раз)
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
Записан
BRE
Гость
« Ответ #1 : Октябрь 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, все крутиться.

Цитировать
Потоки запускаются, отображают листинги. Но через некоторое количество итераций, один из процессов не может стартовать
Сколько итераций нужно ждать?
« Последнее редактирование: Октябрь 25, 2009, 13:07 от BRE » Записан
Sokoloff
Гость
« Ответ #2 : Октябрь 25, 2009, 20:27 »


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

Т.е. код правильный?
Записан
BRE
Гость
« Ответ #3 : Октябрь 25, 2009, 20:33 »

Какие у тебя дистрибутив, Qt и PyQt?
qt-4.5.2-3.fc10.i386
PyQt4-4.5.4-1.fc10.i386
Записан
Sokoloff
Гость
« Ответ #4 : Октябрь 26, 2009, 01:25 »

Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.081 секунд. Запросов: 20.