crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Как правильно запустить несколько последовательных процессов?
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 не зависал). При том что новая обработка должна начинается сразу после окончания старой. А у меня как бы паралельно все работают.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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-а потока. Главный и второстепенный, в котором и запускается обработка. Так вот там уже Ваш способ не прокатит <_<
Проблема ведь в том, что я не могу запустить обработку НЕ в конструкторе класса, который помещаю в поток.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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