crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Запуск QProcess из QThread
Sokoloff
  опции профиля:
сообщение 25.10.2009, 1:32
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Не могу до конца понять как запустить процесс (QProcess) из потока. Написал так:
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 потока,
    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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.10.2009, 2:11
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Sokoloff @ 25.10.2009, 5:32) *
Еще прочитал, что для работы в QThread нужно запустить "event loop" с помощью exec(), но куда его вставить?
См. Создание потока
Вот пример из описания класса QThread:
 class MyThread : public QThread
{
public:
     void run();
};

void MyThread::run()
{
     QTcpSocket socket;
     // connect QTcpSocket's signals somewhere meaningful
     ...
     socket.connectToHost(hostName, portNumber);
     exec(); // <--
}
здесь exec() в конце метода run()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 25.10.2009, 10:33
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Попробуй дожидаться остановки потока:
    def start(self):
        while (1):
            th1 = MyThread('/home')
            th1.start()
            
            th2 = MyThread('/boot')
            th2.start()

            time.sleep(1)

            th1.wait();
            th2.wait();

            del th1;
            del th2;


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

eventloop нужно запускать, если тебе необходимо обрабатывать события в своем потоке. В данном случае он не нужен.

Сообщение отредактировал BRE - 25.10.2009, 10:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 25.10.2009, 11:32
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(BRE @ 25.10.2009, 11:33) *
Попробуй дожидаться остановки потока:

Не помогает. Да и не понятно, как оно может помочь, проблема именно в том, что иногда не запускается QProcess.

Цитата(BRE @ 25.10.2009, 11:33) *
eventloop нужно запускать, если тебе необходимо обрабатывать события в своем потоке. В данном случае он не нужен.

Смутила следующая фраза:
Цитата
Цикл обработки сообщений сделан возможным для потока, чтобы можно было использовать некоторые не-GUI классы Qt, которые требуют наличия цикла обработки сообщений (такие как QTimer, QTcpSocket и QProcess).
http://www.doc.crossplatform.ru/qt/4.3.2/t...read-event-loop

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 25.10.2009, 11:45
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Sokoloff @ 25.10.2009, 11:32) *
Смутила следующая фраза:
Цитата
Цикл обработки сообщений сделан возможным для потока, чтобы можно было использовать некоторые не-GUI классы Qt, которые требуют наличия цикла обработки сообщений (такие как QTimer, QTcpSocket и QProcess).

Если ты захочешь обрабатывать сигналы, которые будет посылать QProcess, тогда нужно будет сделать connect и запустить eventloop.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.4.2024, 8:04