![]() |
|
|
![]()
|
|
| fux |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
Есть два процесса, родительский и дочерний. В родительском ссылка на дочерний QProcess создается при создании процесса, а чтобы наладить двухстороннюю связь, в дочернем нужно иметь ссылку на родителя. Как ее получить?
Заранее благодарю. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Дочернему можно в качестве параметра командной строки передать свой (родительский) ID процесса
Добавлено через 2 минуты и 51 секунду И, кстати, а зачем тебе это нужно ? Мне одному кажется, что этот вопрос - классическая XY-проблема ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| fux |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
Это я понимаю. Но как из ID получить ссылку на QProcecc.
Мне нужно получить каскад процессов, каждый из которых обслуживает свой объект. Раньше у мня был обмен через сокеты, но это работает при одноуровневой системе, для вложенных процессов нужно создавать каскад портов, а это не красиво. |
|||
|
||||
| fux |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
Бред какой-то. Получается дочерний процесс глухой. Хоть бы сигнал ему какой-то послать.
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Послать можно. Через StandardInput. Получить через StandardOutput.
Для более сложного общения нужно писать свой класс, возможно, его код будет зависеть от платформы. |
|||
|
||||
| fux |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
А как подключить стандартный поток дочки к родителю?
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Если используешь QProcess - они по умолчанию связаны.
Для записи в stdin дочки - QProcess::write(), для чтения из stdout/stderr дочки - QProcess::read(), настраивается setReadChannel(). Если нужно связать два дочерних процесса - QProcess::setStandardOutputProcess(). Дочерние процессы читают из stdin, пишут в stdout или stderr. Можно пользоваться cin, cout, cerr. Если хочется использовать QFile, то так:
Собрать можно только цепочку процессов, общающихся между собой, как если бы на консоли набрать command1 | command2 | command3 ... Можно собрать кольцо, соединив вывод последнего процесса со входом первого. Если нужно что-то более сложное - QProcess применить нельзя. Для создания дочерних процессов с дополнительными каналами в Linux нужно вызывать pipe() и fork() и т.д. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Возможно, удобнее общаться через QSharedMemory или файл, отображаемый на памать QFile::map().
Ключ для QSharedMemory или имя файла можно передать в командной строке. |
|||
|
||||
| fux |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 Извините не понял как код вставлять. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
хотя вместо stdoutFile можешь польсоваться std::cout - но чтоб в едином стиле. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Если так не получится, есть два варианта:
1. Повесить reciveStdStr() на таймер QTimer. 2. Читать из stdin в потоке QThread. После чтения данных поток emit сигнал, на который можно подписаться. |
|||
|
||||
| fux |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
readyRead у QFile что-то не работает, может обработчик событий подключить?
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
QFile использует для чтения блокирующее чтение. Для обычных файлов - если прочитал до конца файла, дальше читать нечего. Нужно или реализовывать свой класс, используя неблокирующее чтение (разная реализация для Linux и Windows) или как я предлагал выше, использовать QTimer или QThread.
|
|||
|
||||
| fux |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 21.3.2014 Репутация: нет Всего: нет |
QTimer не получается т.к. arrBlock = stdinFile.readAll().data(); - висит. С QThread надо разбираться. Вообще-то достаточно просто сигнал дочке послать.
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Так проверять надо: if(stdinFile.available() > 0) { ... }
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |