Russian Qt Forum

Qt => Вопросы новичков => Тема начата: helga1917 от Сентябрь 04, 2013, 12:05



Название: QProcess или QThread [НОВЫЙ ВОПРОС]
Отправлено: helga1917 от Сентябрь 04, 2013, 12:05
Здравствуйте!
нужно реализовать такую задачу: есть процесс, который периодически присылает в основную программу данные по каналу вывода, а основная программа, как только они пришли принимает и делает свои манипуляции. (Однопоточный вариант) Но тут встает проблема:
основная программа считывает сразу все данные из канала вывода по завершению работы процесса. Есть ли способ, периодически считывать и обрабатывать данные? Или нужно разбивать программу на два потока?


Название: Re: QProcess или QThread
Отправлено: mutineer от Сентябрь 04, 2013, 12:36
основная программа считывает сразу все данные из канала вывода по завершению работы процесса. Есть ли способ, периодически считывать и обрабатывать данные?

Цитировать
void QProcess::readyReadStandardOutput () [signal]


Название: Re: QProcess или QThread
Отправлено: helga1917 от Сентябрь 04, 2013, 12:45
да, я использую эту функцию. Проблема в том что процесс сразу выполняется, и присылает сразу все данные из канала вывода, а не порционно.


Название: Re: QProcess или QThread
Отправлено: mutineer от Сентябрь 04, 2013, 12:46
Значит у тебя такой быстрый процесс, что порционность просто не успевает происходить


Название: Re: QProcess или QThread
Отправлено: helga1917 от Сентябрь 04, 2013, 12:55
допустим это процесс:
Код:
int main()
{
int a=1;
qDebug()<<a;
//тут код...
a=2;
qDebug()<<a;
}

это основная программа:
Код:
Window::Window()
{
    process = new QProcess(this);
    connect(process, SIGNAL(readyReadStandardError()), this, SLOT(output()));
    process->start("messege.exe");
     process->waitForReadyRead();
    process->waitForFinished();
}
void Window::output()
{}


Название: Re: QProcess или QThread
Отправлено: helga1917 от Сентябрь 04, 2013, 12:58
Цитировать
Значит у тебя такой быстрый процесс, что порционность просто не успевает происходить
Значит надо в процессе между отправкой данных сделать задержку?


Название: Re: QProcess или QThread
Отправлено: mutineer от Сентябрь 04, 2013, 13:00
А зачем ты делаешь process->waitForFinished(); ? С этой строкой пока процесс не закончится, твоя программа не сможет ничего сделать. В том числе и прочитать вывод


Название: Re: QProcess или QThread
Отправлено: helga1917 от Сентябрь 04, 2013, 13:04
убрала waitForFinished, тот же результат


Название: Re: QProcess или QThread
Отправлено: mutineer от Сентябрь 04, 2013, 13:07
А зачем тебе вообще порционность, если процесс выполняется так быстро?


Название: Re: QProcess или QThread
Отправлено: helga1917 от Сентябрь 04, 2013, 13:15
я пока не знаю как в реальности будет работать процесс, может также быстро, может медленней (это зависит от условий, которые пока не известны) это пока тестовый вариант


Название: Re: QProcess или QThread
Отправлено: mutineer от Сентябрь 04, 2013, 13:18
Ну так сделай чтобы он работал медленно, и тогда уже посмотри будет ли порциями читать


Название: Re: QProcess или QThread
Отправлено: helga1917 от Сентябрь 04, 2013, 13:22
вставила между порциями данных цикл (int i=0; i<1000000000; i++){} и данные стали приходить порциями  :)
спасибо!


Название: Re: QProcess или QThread
Отправлено: gil9red от Сентябрь 04, 2013, 14:05
ну зачем же так извращаться? )
сделайте бесконечный цикл (while(true) или for(;;))


Название: Re: QProcess или QThread
Отправлено: helga1917 от Сентябрь 04, 2013, 14:51
если использовать бесконечный цикл, то программа пошлет одну порцию данных, а потом будет выполнять бесконечный цикл и все на этом


Название: Re: QProcess или QThread
Отправлено: helga1917 от Сентябрь 04, 2013, 15:29
у меня теперь новая проблема, делаю все тоже самое, только порции данных должны процессом отправляться при нажатии на кнопку.
Но в основную программу ничего не приходит. подскажите почему?
Код:
Window::Window{
but1 = new QPushButton;
but2 = new QPushButton;

 connect(but1,SIGNAL(clicked()),this, SLOT(sendMess1()));
 connect(but2,SIGNAL(clicked()),this, SLOT(sendMess2()));
}
void Window::sendMess1()
{
qDebug()<<0;
}
void Window::sendMess2()
{
qDebug()<<1;
}

программа:
Код:
Window::Window()
{
    process = new QProcess(this);
    connect(process, SIGNAL(readyReadStandardError()), this, SLOT(output()));
    process->start("messege.exe");
     process->waitForReadyRead(100000);  //ждет данные, посылаемые при клике на кнопку
   
}
void Window::output()
{}


Название: Re: QProcess или QThread
Отправлено: mutineer от Сентябрь 04, 2013, 15:50
убери waitForReadyRead


Название: Re: QProcess или QThread [НОВЫЙ ВОПРОС]
Отправлено: helga1917 от Сентябрь 04, 2013, 15:53
так пробовала, тоже самое 


Название: Re: QProcess или QThread
Отправлено: Kurles от Сентябрь 05, 2013, 12:19
вставила между порциями данных цикл (int i=0; i<1000000000; i++){} и данные стали приходить порциями  :)
спасибо!
Интересное решение - пауза между данными будет зависеть от быстроты процессора )