crossplatform.ru

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

RazrFalcon
  опции профиля:
сообщение 30.8.2011, 19:24
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  



thread = new QThread(this);
for (int p = 0; p < 3; ++p) {
  prc = new Processor(); // Processor класс-наследник qobject. В конструкторе запускает QProcess.
  prc->moveToThread(thread);
}
thread->start();
В итоге у меня запускается три Processor одновременно. А как сделать, что бы они стратовали по очереди? То есть, у меня есть отдельный поток, и в нем я запускаю обработку (что бы GUI не зависал). При том что новая обработка должна начинается сразу после окончания старой. А у меня как бы паралельно все работают.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V   1 2 3 >  
Начать новую тему
Ответов (1 - 23)
Dovgon
  опции профиля:
сообщение 30.8.2011, 21:08
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 92
Регистрация: 5.1.2011
Пользователь №: 2325

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




Репутация:   0  


Почитай про симафоры или мютаксы. По простому передаешь в каждый процес один и тотже указатель на переменную, в начальном значении работает первый остальные ожидают, в конце первого процеза изминяешь его что бы заработал второй и так далее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 30.8.2011, 22:14
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Эммм... как то слишком сложно.
Может можно просто запускать процессы руками, когда захочу?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 31.8.2011, 11:01
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


up!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 31.8.2011, 15:21
Сообщение #5


Старейший участник
****

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

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




Репутация:   12  


а зачем в таком случае 3 процесса запускать?:) (если они решают последовательно задачу)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 31.8.2011, 15:55
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Перефразирую.
Нужно запустить программу с разными ключами 3-и раза. Подряд.

PS: вы про
proga -a; proga -b; proga -c
.Да, не подумал о таком... Но это как то странно выглядит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MJIbIu
  опции профиля:
сообщение 31.8.2011, 16:26
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 14.4.2010
Пользователь №: 1630

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




Репутация:   0  


Цитата(RazrFalcon @ 31.8.2011, 16:55) *
Перефразирую.
Нужно запустить программу с разными ключами 3-и раза. Подряд.

PS: вы про
proga -a; proga -b; proga -c
.Да, не подумал о таком... Но это как то странно выглядит.

а зачем запускать 3 раза если они будут у тебя идти по порядку ?
proga a b c // 3 аргумента 
int main(int argc, char* argv[])
{
............
thread = new QThread(this);
prc = new Processor(argv); // засовывай в Processor и обрабатывай их там по очереди 
prc->moveToThread(thread);
thread->start();

}

мб я не так понял

Сообщение отредактировал MJIbIu - 31.8.2011, 16:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 31.8.2011, 16:37
Сообщение #8


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Ну сейчас так и происходит.
Разве что:
bool QProcess::waitForFinished ( int msecs = 30000 )
приводит к зависанию главного окна, а не должен.

По этому выкрутился, пока что, запуском процесса по окончании предыдущего:
int curr = 0;

Processor::Processor(QStringList argsList, QObject *parent) :
    QObject(parent)
{
  proc = new QProcess(this);
  connect(proc,SIGNAL(finished(int)),this,SLOT(finished(int)));

  finished(1);
}

void Processor::finished(int)
{
  if (curr < argsList.count()) {
    proc->start("proga", argsList.at(curr));
    curr++;
  } else {
    emit done();
  }
}


Сообщение отредактировал RazrFalcon - 31.8.2011, 16:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 1.9.2011, 13:58
Сообщение #9


Участник
**

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

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




Репутация:   3  


Вот так работает. Быстрый набросок.

main.cpp
#include <QCoreApplication>
#include <QDir>
#include "ProcessManager.h"

int main ( int narg, char ** varg )
{
    QCoreApplication app( narg, varg );
    ProcessManager manager;
    app.connect( &manager, SIGNAL( finished() ), SLOT( quit() ), Qt::QueuedConnection );

    manager.append( QDir::currentPath() + "/test.bat" );
    manager.append( QDir::currentPath() + "/test.bat" );
    manager.append( QDir::currentPath() + "/test.bat" );
    manager.start();

    return app.exec();
}


ProcessManager.h

#ifndef PROCESSMANAGER_H
#define PROCESSMANAGER_H

#include <QObject>
#include <QProcess>

class ProcessManager : public QObject
{
    Q_OBJECT
private:
    QStringList proc_files;
    QProcess * process;
    int current_proc;

public:
    explicit ProcessManager ( QObject *parent = 0 );

    void append ( const QString & proc_file );
    void start ();

public slots:
    void nextProccess ();
    void onError ();

signals:
    void finished ();
};

#endif // PROCESSMANAGER_H


ProcessManager.cpp

#include <QDebug>
#include "ProcessManager.h"

ProcessManager::ProcessManager(QObject *parent)
    : QObject(parent)
    , process( new QProcess( this ) )
    , current_proc()
{
    connect( process, SIGNAL( error( QProcess::ProcessError ) )
        , this, SLOT( onError() ) );
    connect( process, SIGNAL( finished ( int, QProcess::ExitStatus ) )
        , this, SLOT( nextProccess() ) );
}

void ProcessManager::append ( const QString & proc_file )
{
    proc_files.append( proc_file );
}

void ProcessManager::start ()
{
    current_proc = 0;
    nextProccess ();
}

void ProcessManager::nextProccess ()
{
    if ( current_proc < proc_files.count() )
        process->start( proc_files.at( current_proc++ ) );
    else
        emit finished();
}

void ProcessManager::onError ()
{
    qWarning() << "Process execute error";
    emit finished();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 1.9.2011, 14:27
Сообщение #10


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Оно то может и работает. Но у меня не консольное приложение.
У меня есть 2-а потока. Главный и второстепенный, в котором и запускается обработка. Так вот там уже Ваш способ не прокатит <_<
Проблема ведь в том, что я не могу запустить обработку НЕ в конструкторе класса, который помещаю в поток.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 5.9.2011, 14:48
Сообщение #11


Участник
**

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

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




Репутация:   3  


Цитата(RazrFalcon @ 1.9.2011, 15:27) *
Оно то может и работает. Но у меня не консольное приложение.
У меня есть 2-а потока. Главный и второстепенный, в котором и запускается обработка. Так вот там уже Ваш способ не прокатит <_<
Проблема ведь в том, что я не могу запустить обработку НЕ в конструкторе класса, который помещаю в поток.


Очень даже прокатывает.

1. Причем здесь тип приложения?

ProcessManager можно создать в любом потоке, можно и во второстепенном.

2. Обработка, как я понимаю, происходит в вызываемых процессах, а не во второстепенном потоке.

Здесь предложен способ последовательного запуска процессов обработки без использования второстепенного потока, при этом GUI не будет подвешиваться, так как используется ассинхронное оповещение через очередь сообщений Qt.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 5.9.2011, 16:02
Сообщение #12


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Ну у меня ваш код не заработал. Так что...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 7.9.2011, 13:06
Сообщение #13


Участник
**

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

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




Репутация:   3  


Цитата(RazrFalcon @ 5.9.2011, 17:02) *
Ну у меня ваш код не заработал. Так что...

Всем желающим рабочий пример ;)

Прикрепленные файлы
Прикрепленный файл  test.zip ( 4.07 килобайт ) Кол-во скачиваний: 83
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 7.9.2011, 17:05
Сообщение #14


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


../test/program/main.cpp:2: error: conio.h: No such file or directory
уже весeло...

Зачем вообще юзать std в кьюте?

Сообщение отредактировал RazrFalcon - 7.9.2011, 17:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 11.9.2011, 22:30
Сообщение #15


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Вопрос все еще открыт.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 12.9.2011, 11:33
Сообщение #16


Участник
**

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

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




Репутация:   11  


Цитата(RazrFalcon @ 11.9.2011, 23:30) *
Вопрос все еще открыт.

Через сигнал finished, нормальное решение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 12.9.2011, 15:33
Сообщение #17


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Если вы про тот что я привел, то тут тоже не все гладко.
Валятся такие ошибки:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x92891d8), parent's thread is QThread(0x90fb448), current thread is QThread(0x91b9470)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x92891d8), parent's thread is QThread(0x90fb448), current thread is QThread(0x91b9470)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x92891d8), parent's thread is QThread(0x90fb448), current thread is QThread(0x91b9470)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x92891d8), parent's thread is QThread(0x90fb448), current thread is QThread(0x91b9470)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x92891d8), parent's thread is QThread(0x90fb448), current thread is QThread(0x91b9470)

Если сделать дополнительно waitForFinished(), то вроде пашет, но текст на сигнал readyReadStandardOutput() не приходит, так как процесс ждет...

Вот и не ясно как оно должно работать?

Вопрос: нужен ли waitForFinished() внутри дочернего потока?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 22.9.2011, 16:29
Сообщение #18


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Up
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 13.10.2011, 4:15
Сообщение #19


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Написал пример (в аттаче).
Почему оно не работает?

У меня с waitForFinished(); главное окно не появляется, без - валятся потоки:
Раскрывающийся текст
"0
" 
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
"0
" 
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
"0
" 
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
"0
" 
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x9d81ab0), parent's thread is QThread(0x9cef448), current thread is QThread(0x9ddb810)
QProcess::start: Process is already running
"0

А вывод должен быть таким:
0
1
2
3
4
etc.


Заранее спасибо!

Сообщение отредактировал RazrFalcon - 13.10.2011, 4:15
Прикрепленные файлы
Прикрепленный файл  thread_example.zip ( 2.91 килобайт ) Кол-во скачиваний: 64
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 13.10.2011, 7:28
Сообщение #20


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

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

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




Репутация:   44  


Ну так Qt в консоль тебе все пишет. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 13.10.2011, 7:38
Сообщение #21


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


<_<
И что я должен исправить?!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 13.10.2011, 11:01
Сообщение #22


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

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

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




Репутация:   44  


Цитата(RazrFalcon @ 13.10.2011, 8:38) *
<_<
И что я должен исправить?!


Thread::Thread(QObject *parent) :
    QObject(parent)
{
    curr = 0;

    proc = new QProcess( this );        // <<<<<<<<<<<< Здесь нужно указывать родителя. Иначе при перемещении объекта этого класса в рабочий поток, объект proc перемещен не будет!
    connect(proc,SIGNAL(readyRead()),this,SLOT(readOutput()));
    connect(proc,SIGNAL(finished(int)),this,SLOT(startNew()));

    startNew();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 13.10.2011, 13:16
Сообщение #23


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Огромное спасибо! Теперь пашет.
И как я не мог до этого додуматься уже как 2-а месяца...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 17.10.2011, 16:33
Сообщение #24


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

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




Репутация:   8  



Цитата
Разве что:
bool QProcess::waitForFinished ( int msecs = 30000 )
приводит к зависанию главного окна, а не должен.


решается просто

while( !process->waitForFinished(10) )
qApp->processEvents(); // все потоки работают и GUI не виснет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 24.6.2025, 16:19