Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить ссылку на процесс QProcess, Обмен данными между процессами 
:(
    Опции темы
fux
Дата 8.10.2015, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



Есть два процесса, родительский и дочерний. В родительском ссылка на дочерний QProcess создается при создании процесса, а чтобы наладить двухстороннюю связь, в дочернем нужно иметь ссылку на родителя. Как ее получить?
Заранее благодарю.
PM MAIL   Вверх
borisbn
Дата 8.10.2015, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Дочернему можно в качестве параметра командной строки передать свой (родительский) ID процесса

Добавлено через 2 минуты и 51 секунду
И, кстати, а зачем тебе это нужно ?
Мне одному кажется, что этот вопрос - классическая XY-проблема ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
fux
Дата 8.10.2015, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



Это я понимаю. Но как из ID получить ссылку на QProcecc.
Мне нужно получить каскад процессов, каждый из которых обслуживает свой объект. Раньше у мня был обмен через сокеты, но это работает при одноуровневой системе, для вложенных процессов нужно создавать каскад портов, а это не красиво.
PM MAIL   Вверх
fux
Дата 12.10.2015, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



Бред какой-то. Получается дочерний процесс глухой. Хоть бы сигнал ему какой-то послать.
PM MAIL   Вверх
math64
Дата 12.10.2015, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Послать можно. Через StandardInput. Получить через StandardOutput.
Для более сложного общения нужно писать свой класс, возможно, его код будет зависеть от платформы.
PM   Вверх
fux
Дата 13.10.2015, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



А как подключить стандартный поток дочки к родителю?

PM MAIL   Вверх
math64
Дата 13.10.2015, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Если используешь QProcess - они по умолчанию связаны.
Для записи в stdin дочки - QProcess::write(), для чтения из stdout/stderr дочки - QProcess::read(), настраивается setReadChannel().
Если нужно связать два дочерних процесса - QProcess::setStandardOutputProcess().

Дочерние процессы читают из stdin, пишут в stdout или stderr.
Можно пользоваться cin, cout, cerr.
Если хочется использовать QFile, то так:
Код

     QFile file;
     file.open(stdout, QIODevice::WriteOnly);



Собрать можно только цепочку процессов, общающихся между собой, как если бы на консоли набрать
command1 | command2 | command3 ...
Можно собрать кольцо, соединив вывод последнего процесса со входом первого.
Если нужно что-то более сложное - QProcess применить нельзя.
Для создания дочерних процессов с дополнительными каналами  в Linux нужно вызывать pipe() и fork() и т.д.



PM   Вверх
math64
Дата 13.10.2015, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Возможно, удобнее общаться через QSharedMemory или файл, отображаемый на памать QFile::map().
Ключ для QSharedMemory или имя файла можно передать в командной строке.
PM   Вверх
fux
Дата 13.10.2015, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



Я представляю так:
В родителе
QProcess    procIc;
void MainWindow::on_runChild_clicked()      //запустить дочку
{
    procIc.start("driven.exe");             //
    connect(&procIc,SIGNAL(readyRead()),SLOT(readStr()));
}
void MainWindow::on_sendToChild_clicked()   //передать в дочку
{
    QString tmp = "ReceiveDat";
    procIc.write(tmp.toAscii());
}
void MainWindow::readStr()                  //читать строку
{
    QByteArray  arrBlock;
    arrBlock = procIc.readAll().data();     //
    QString str = arrBlock;                 //
    ui->lineEdit->setText(str);
}
 
в дочке

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(stdin_what_it,SIGNAL(readyRead()),SLOT(reciveStdStr()));
}

void MainWindow::reciveStdStr()         //получить строку из стандартного потока
{
    QByteArray  arrBlock;
    arrBlock = stdin_what_it->readAll().data();     //
    QString str = arrBlock;                 //
    ui->lineEdit->setText(str);
}
void MainWindow::on_sendToParent_clicked()  //передать строку родителю
{
    QString tmp = "ReceiveDat";
    std::cout << tmp.toStdString() << std::endl;
}

что это - stdin_what_it

Извините не понял как код вставлять.
PM MAIL   Вверх
math64
Дата 13.10.2015, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Код

class MainWindow : public QWindow {
...
private:
   QFile stdinFile;
   QFile stdoutFile;
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    stdinFile.open(stdin, QIODevice::ReadOnly);
    stdoutFile.open(stdout, QIODevice::WriteOnly);
    connect(&stdinFile,SIGNAL(readyRead()),SLOT(reciveStdStr()));
}

void MainWindow::reciveStdStr()         //получить строку из стандартного потока
{
    QByteArray  arrBlock;
    arrBlock = stdinFile.readAll().data();     //
    QString str = arrBlock;                 //
    ui->lineEdit->setText(str);
}

void MainWindow::on_sendToParent_clicked()  //передать строку родителю
{
    QString tmp = "ReceiveDat";
    stdoutFile.write(tmp.toStdString());
    stdoutFile.write('\n');
}

хотя вместо stdoutFile можешь польсоваться std::cout - но чтоб в едином стиле.
PM   Вверх
math64
Дата 13.10.2015, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Если так не получится, есть два варианта:
1. Повесить reciveStdStr() на таймер QTimer.
2. Читать из stdin в потоке QThread. После чтения данных поток emit сигнал, на который можно подписаться.
PM   Вверх
fux
Дата 13.10.2015, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



readyRead у QFile что-то не работает, может обработчик событий подключить?

PM MAIL   Вверх
math64
Дата 13.10.2015, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



QFile использует для чтения блокирующее чтение. Для обычных файлов - если прочитал до конца файла, дальше читать нечего. Нужно или реализовывать свой класс, используя неблокирующее чтение (разная реализация для Linux и Windows) или как я предлагал выше, использовать QTimer или QThread.
PM   Вверх
fux
Дата 13.10.2015, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 21.3.2014

Репутация: нет
Всего: нет



QTimer  не получается т.к. arrBlock = stdinFile.readAll().data(); - висит. С QThread надо разбираться. Вообще-то достаточно просто сигнал дочке послать.
PM MAIL   Вверх
math64
Дата 13.10.2015, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Так проверять надо: if(stdinFile.available() > 0) { ... }
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.