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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: объясните работу процесса  (Прочитано 8910 раз)
alex
Гость
« : Декабрь 07, 2012, 12:57 »

Правильно ли я понимаю: с помощью start мы запускаем процесс, параллельно с его выполнением работает и наша программа , но с учетом цикла событий, тоесть более поздние события останавливаются. waitForStarted останавливает этот процесс и как бы пропускает его очередь в цикле до того момента как он снова не станет в очередь? и еще - я написал некоторую программу принимающую аргументы командной строки через main(argc,argv) и печатающую их в стандартный поток вывода. В программе кутэ я делаю start() этого потока с аргументами, но при этом после чтения потока вывода процесса никаких данных не приходит. в чем причина? буду рад полезным материалам из сети. Веселый Подмигивающий
« Последнее редактирование: Декабрь 07, 2012, 13:01 от alex » Записан
Bepec
Гость
« Ответ #1 : Декабрь 07, 2012, 13:17 »

Код, Код, Код.
Записан
mutineer
Гость
« Ответ #2 : Декабрь 07, 2012, 13:38 »

Нифига непонятно, куча сумбура
Записан
alex
Гость
« Ответ #3 : Декабрь 07, 2012, 14:02 »

вот код. Первый - вызов процесса из  кутэ, второй - процесс, напсианный в visual studio, собранный без ошибок

Код:
#include <QtCore/QCoreApplication>
#include "QProcess"
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QProcess test;
    QStringList arglist;
    arglist<<"2"<<"100"<<"4";
    test.start("D:\qtprocessTest\Release\qtprocessTest", arglist);
    test.setReadChannel(QProcess::StandardOutput);
    char *data;
    std::cout<<test.bytesAvailable()<<"\t"<<test.bytesToWrite()<<"\t";
    test.read(data,100500);
    std::cout<<data;

    return a.exec();
}








qtprocessTest.exe :
Код:
#include <iostream>
int main(int argc,char* argv[]){
std::cout<<"program name:"<<argv[0]<<"/n number of arguments: "<<argc<<"/n";
for(int i=1;i<argc;i++)
std::cout<<argv[i]<<"/t";
int input;
std::cin>>input;
std::cout<<1<<"/n";
//system("pause");
return 777;


}
  Веселый
« Последнее редактирование: Декабрь 07, 2012, 14:10 от alex » Записан
Bepec
Гость
« Ответ #4 : Декабрь 07, 2012, 14:46 »

Код:
 char *data;
    test.read(data,100500);

Позволь мне узнать, о величий и могучий, а куда ты помещаешь данные? По неинициализированному указателю?
Записан
alex
Гость
« Ответ #5 : Декабрь 07, 2012, 15:38 »

изменил код . Теперь он выглядит так:
Код:
#include <QtCore/QCoreApplication>
#include "QProcess"
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QProcess test;
    QStringList arglist;
    arglist<<"2"<<"100"<<"4";
    test.start("D:\qtprocessTest\Release\qtprocessTest", arglist);
    test.setReadChannel(QProcess::StandardOutput);
    test.waitForStart();
    test.waitForFinished();
    char *data= char[30];
    std::cout<<test.bytesAvailable()<<"\t"<<test.bytesToWrite()<<"\t";
    test.read(data,30);
    std::cout<<data;

    return a.exec();
}
Записан
_OLEGator_
Гость
« Ответ #6 : Декабрь 07, 2012, 15:50 »

И ты хочешь сказать, что это компилится и работает?!
Код
C++ (Qt)
char *data= char[30];
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Декабрь 07, 2012, 16:02 »

Палок добавьте
Код
C++ (Qt)
   test.start("D:\\qtprocessTest\\Release\\qtprocessTest", arglist);
 
И убедитесь что стартует, как - разберетесь по букварю. А потом уже будете вывод читать - не все сразу  
Записан
alex
Гость
« Ответ #8 : Декабрь 07, 2012, 16:08 »

Палок добавьте
Код
C++ (Qt)
   test.start("D:\\qtprocessTest\\Release\\qtprocessTest", arglist);
 
И убедитесь что стартует, как - разберетесь по букварю. А потом уже будете вывод читать - не все сразу  


 Смеющийся   у меня код на другом компе, потому что я  на работе. там оператор нью стоит все норм. Вообщем ошибки нашли крмое одной. я чуть изменил код, вот так:
Код:
 
...
test.waitForStart();
   test.write("666");
    test.waitForFinished();
...


код вызываемой функции изменил так:
Код:
...
char *PutinsNumber= new char[5];
cin>>PutinsNumber;
..
при этом строка не передалась в функцию
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 07, 2012, 16:17 »

код вызываемой функции изменил так:
Код:
...
char *PutinsNumber= new char[5];
cin>>PutinsNumber;
..
при этом строка не передалась в функцию
Наведите порядок в своем тексте и мыслях - а потом спрашивайте на форуме
Записан
alex
Гость
« Ответ #10 : Декабрь 08, 2012, 16:01 »

Полностью изменил код. теперь он выглядит так:
Код:
#include <QtCore/QCoreApplication>
#include "testing.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    testing test;
    test.run();
   
    return a.exec();
}

класс тестера
testing.h
Код:
#ifndef TESTING_H
#define TESTING_H
#include <QProcess>
#include <QObject>
#include <iostream>
using namespace std;

class testing:public QObject
{
    Q_OBJECT
public:
    testing();
    QProcess process;
    void run();

public slots:
    void dataOnStdout();
    void errorOccured(QProcess::ProcessError errorId);
    void finishReading();
    void bytesWritten(qint64 num);
    void processClosing();
};

#endif // TESTING_H

testing.cpp

Код:
#include "testing.h"

testing::testing(): QObject(0)
{


    connect(&process,SIGNAL(readyReadStandardOutput()),this,SLOT(dataOnStdout()));
    connect(&process,SIGNAL(error(QProcess::ProcessError)),this,SLOT(errorOccured(QProcess::ProcessError)));
    connect(&process,SIGNAL(readChannelFinished()),this,SLOT(finishReading()));
    connect(&process,SIGNAL(bytesWritten(qint64)),this,SLOT(bytesWritten(qint64)));
    connect(&process,SIGNAL(aboutToClose()),this,SLOT(processClosing()));







}

void testing::run(){
    process.start(QString("C:\\Qt\\prj\\testing\\certainprocess 1 2 3 4 5 6 7 8 9 0"));
    cout<<"\n > [qt]process.start();";

    process.write("meow",60);
    process.write("gaf-gaf",60);
    process.write("end",60);
    if(!process.waitForStarted(15000))cout<<"[qt]"<<process.error();
    else
    cout<<"\n > [qt]process.waitForStarted(); ";


    if(!process.waitForFinished(15000))cout<<"[qt]"<<process.error();
    else
    cout<<"\n > [qt]process.waitForFinish(); ";
    process.kill();
}

void testing::dataOnStdout(){
    cout<<"\n >dataOnStdout";
    QByteArray str=process.readAllStandardOutput();

    cout<<"\n stdout>"<<str.data();

}

void testing::errorOccured(QProcess::ProcessError errorId){
    cout<<"\n >errorOccured";
    cout<<"\n >error :" <<errorId;
}

void testing::finishReading(){
    cout<<"\n > reading from process finished";
}

void testing::bytesWritten(qint64 num){
    cout <<"\n > "<<num<<" bytes written";
}

void testing::processClosing(){
    cout<<"\n > process is closing";
}


и сам вызываемый поток
certainprocess

Код:
#include <iostream>
#include "stdio.h"
#include "string.h"

using namespace std;

int main(int argc, char* argv[])
{
    cout<<"[process itself]program name: "<<argv[0]<<endl;
    for(int i=1;i<argc;i++)
        cout<<"[process itself]parametrs: "<<argv[i]<<", ";
    cout<<endl;
    char *str=new char[60];
    cin>>str;
    cout<<"[process itself]----->"<<str<<endl;
    delete []str;
    cout << "[process itself]\n bye bye !" << endl;
    return 0;
}


Но новый не только код но и появившиеся ошибки. А именно - если убрать второй аргумент в функции process.write то происходит зацикливание, полный бред. После компилирования кода функция process.write записывает аргумент в поток вывода но почему-то выводится лишь ее первое значение , а именно "meow". остальные два вызова как будто игнорируются.
вот консольный вывод программы


PS сделайте на форуме нормальный загрузчик изображений
« Последнее редактирование: Декабрь 08, 2012, 16:03 от alex » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Декабрь 08, 2012, 16:48 »

Но новый не только код но и появившиеся ошибки. А именно - если убрать второй аргумент в функции process.write то происходит зацикливание, полный бред. После компилирования кода функция process.write записывает аргумент в поток вывода но почему-то выводится лишь ее первое значение , а именно "meow". остальные два вызова как будто игнорируются.
Ну в этом ничего удивительного нет, Вы один раз cin читали, одну строку и получили. Насчет не работающего write - так быть не должно. Однако у меня нет никакого энтузиазма выдирать отсюда Ваши тексты - выложите в архиве исходники + pro файл, тогда посмотрим.

PS сделайте на форуме нормальный загрузчик изображений
Как-то это звучит.. ну неуместно, что ли. Люди могут подумать "Во блин, поток с процессом путает, пишет как курица лапой - зато дает указания что сделать"  Улыбающийся
Записан
alex
Гость
« Ответ #12 : Декабрь 08, 2012, 17:09 »

прошу прощения, но я не путаю поток с процессом) вот архив
PS я продублировал вызов
Код:
cin>>str;
чтобы читалось именно 3 раза, но эффекта 0 - выводится лишь первая строка meow.
« Последнее редактирование: Декабрь 08, 2012, 17:11 от alex » Записан
alex
Гость
« Ответ #13 : Декабрь 09, 2012, 10:37 »

Тоесть проблема в том, что мне необходимо считывать данные в тестируемую программу несколько раз. Например вот так
Код:
#include <iostream>
#include "stdio.h"
#include "string.h"

using namespace std;

int main(int argc, char* argv[])
{
    cout<<"[process itself]program name: "<<argv[0]<<endl;
    for(int i=1;i<argc;i++)
        cout<<"[process itself]parametrs: "<<argv[i]<<", ";
    cout<<endl;
    char *str=new char[60];

    cout << "[process itself]\n first value " << endl;

    cin>>str;
    cout<<"[process itself]----->"<<str<<endl;

    cout << "[process itself]\n second value " << endl;

    cin>>str;
    cout<<"[process itself]----->"<<str<<endl;

   cout << "[process itself]\n third value " << endl;

    cin>>str;
    cout<<"[process itself]----->"<<str<<endl;


    delete []str;
    cout << "[process itself]\n bye bye !" << endl;
    return 0;
}

Но выводится лишь первая считываемая строка. в чем ошибка
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Декабрь 09, 2012, 11:57 »

Попробуйте
Код
C++ (Qt)
   process.write("meow\n");
   process.write("gaf-gaf\n");
   process.write("end\n");
 
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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