Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: alex от Декабрь 07, 2012, 12:57



Название: объясните работу процесса
Отправлено: alex от Декабрь 07, 2012, 12:57
Правильно ли я понимаю: с помощью start мы запускаем процесс, параллельно с его выполнением работает и наша программа , но с учетом цикла событий, тоесть более поздние события останавливаются. waitForStarted останавливает этот процесс и как бы пропускает его очередь в цикле до того момента как он снова не станет в очередь? и еще - я написал некоторую программу принимающую аргументы командной строки через main(argc,argv) и печатающую их в стандартный поток вывода. В программе кутэ я делаю start() этого потока с аргументами, но при этом после чтения потока вывода процесса никаких данных не приходит. в чем причина? буду рад полезным материалам из сети. :D ;)


Название: Re: объясните работу процесса
Отправлено: Bepec от Декабрь 07, 2012, 13:17
Код, Код, Код.


Название: Re: объясните работу процесса
Отправлено: mutineer от Декабрь 07, 2012, 13:38
Нифига непонятно, куча сумбура


Название: Re: объясните работу процесса
Отправлено: alex от Декабрь 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;


}
  :D


Название: Re: объясните работу процесса
Отправлено: Bepec от Декабрь 07, 2012, 14:46
Код:
 char *data;
    test.read(data,100500);

Позволь мне узнать, о величий и могучий, а куда ты помещаешь данные? По неинициализированному указателю?


Название: Re: объясните работу процесса
Отправлено: alex от Декабрь 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();
}


Название: Re: объясните работу процесса
Отправлено: _OLEGator_ от Декабрь 07, 2012, 15:50
И ты хочешь сказать, что это компилится и работает?!
Код
C++ (Qt)
char *data= char[30];


Название: Re: объясните работу процесса
Отправлено: Igors от Декабрь 07, 2012, 16:02
Палок добавьте
Код
C++ (Qt)
   test.start("D:\\qtprocessTest\\Release\\qtprocessTest", arglist);
 
И убедитесь что стартует, как - разберетесь по букварю. А потом уже будете вывод читать - не все сразу  


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


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


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


Название: Re: объясните работу процесса
Отправлено: Igors от Декабрь 07, 2012, 16:17
код вызываемой функции изменил так:
Код:
...
char *PutinsNumber= new char[5];
cin>>PutinsNumber;
..
при этом строка не передалась в функцию
Наведите порядок в своем тексте и мыслях - а потом спрашивайте на форуме


Название: Re: объясните работу процесса
Отправлено: alex от Декабрь 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 сделайте на форуме нормальный загрузчик изображений


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

PS сделайте на форуме нормальный загрузчик изображений
Как-то это звучит.. ну неуместно, что ли. Люди могут подумать "Во блин, поток с процессом путает, пишет как курица лапой - зато дает указания что сделать"  :)


Название: Re: объясните работу процесса
Отправлено: alex от Декабрь 08, 2012, 17:09
прошу прощения, но я не путаю поток с процессом) вот архив
PS я продублировал вызов
Код:
cin>>str;
чтобы читалось именно 3 раза, но эффекта 0 - выводится лишь первая строка meow.


Название: Re: объясните работу процесса
Отправлено: alex от Декабрь 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;
}

Но выводится лишь первая считываемая строка. в чем ошибка


Название: Re: объясните работу процесса
Отправлено: Igors от Декабрь 09, 2012, 11:57
Попробуйте
Код
C++ (Qt)
   process.write("meow\n");
   process.write("gaf-gaf\n");
   process.write("end\n");
 


Название: Re: объясните работу процесса
Отправлено: alex от Декабрь 09, 2012, 13:29
Попробуйте
Код
C++ (Qt)
   process.write("meow\n");
   process.write("gaf-gaf\n");
   process.write("end\n");
 

спасибо, все получилось. Видимо как и при обычном вводе буфер ввода сбрасывается после нажатия entera