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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QProcess или QThread [НОВЫЙ ВОПРОС]  (Прочитано 7034 раз)
helga1917
Гость
« : Сентябрь 04, 2013, 12:05 »

Здравствуйте!
нужно реализовать такую задачу: есть процесс, который периодически присылает в основную программу данные по каналу вывода, а основная программа, как только они пришли принимает и делает свои манипуляции. (Однопоточный вариант) Но тут встает проблема:
основная программа считывает сразу все данные из канала вывода по завершению работы процесса. Есть ли способ, периодически считывать и обрабатывать данные? Или нужно разбивать программу на два потока?
« Последнее редактирование: Сентябрь 04, 2013, 15:50 от helga1917 » Записан
mutineer
Гость
« Ответ #1 : Сентябрь 04, 2013, 12:36 »

основная программа считывает сразу все данные из канала вывода по завершению работы процесса. Есть ли способ, периодически считывать и обрабатывать данные?

Цитировать
void QProcess::readyReadStandardOutput () [signal]
Записан
helga1917
Гость
« Ответ #2 : Сентябрь 04, 2013, 12:45 »

да, я использую эту функцию. Проблема в том что процесс сразу выполняется, и присылает сразу все данные из канала вывода, а не порционно.
Записан
mutineer
Гость
« Ответ #3 : Сентябрь 04, 2013, 12:46 »

Значит у тебя такой быстрый процесс, что порционность просто не успевает происходить
Записан
helga1917
Гость
« Ответ #4 : Сентябрь 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()
{}
Записан
helga1917
Гость
« Ответ #5 : Сентябрь 04, 2013, 12:58 »

Цитировать
Значит у тебя такой быстрый процесс, что порционность просто не успевает происходить
Значит надо в процессе между отправкой данных сделать задержку?
Записан
mutineer
Гость
« Ответ #6 : Сентябрь 04, 2013, 13:00 »

А зачем ты делаешь process->waitForFinished(); ? С этой строкой пока процесс не закончится, твоя программа не сможет ничего сделать. В том числе и прочитать вывод
Записан
helga1917
Гость
« Ответ #7 : Сентябрь 04, 2013, 13:04 »

убрала waitForFinished, тот же результат
Записан
mutineer
Гость
« Ответ #8 : Сентябрь 04, 2013, 13:07 »

А зачем тебе вообще порционность, если процесс выполняется так быстро?
Записан
helga1917
Гость
« Ответ #9 : Сентябрь 04, 2013, 13:15 »

я пока не знаю как в реальности будет работать процесс, может также быстро, может медленней (это зависит от условий, которые пока не известны) это пока тестовый вариант
Записан
mutineer
Гость
« Ответ #10 : Сентябрь 04, 2013, 13:18 »

Ну так сделай чтобы он работал медленно, и тогда уже посмотри будет ли порциями читать
Записан
helga1917
Гость
« Ответ #11 : Сентябрь 04, 2013, 13:22 »

вставила между порциями данных цикл (int i=0; i<1000000000; i++){} и данные стали приходить порциями  Улыбающийся
спасибо!
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #12 : Сентябрь 04, 2013, 14:05 »

ну зачем же так извращаться? )
сделайте бесконечный цикл (while(true) или for(;Подмигивающий)
Записан

helga1917
Гость
« Ответ #13 : Сентябрь 04, 2013, 14:51 »

если использовать бесконечный цикл, то программа пошлет одну порцию данных, а потом будет выполнять бесконечный цикл и все на этом
Записан
helga1917
Гость
« Ответ #14 : Сентябрь 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()
{}
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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