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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Организовать межпроцессный обмен данными  (Прочитано 3544 раз)
xwicked
Гость
« : Июнь 17, 2015, 22:39 »

Привет!

Есть одна программа-интерфейс к другой программе-ядру. Ядро - консольное приложение, которое запускается с определёнными параметрами и выполняет весь функционал. Как организовать двухстороннюю передачу данных? Стандартные потоки передают текстовую информацию с искажениями. Загружая например html-файл в unicode, из ядра передаётся интерфейсу двухбайтовая html'ка полностью, то есть браузер уже не может правильно отображать полученные данные.
Частичный код интерфейс:
Код
C++ (Qt)
void Window::slotDataOnStdOut()
{
   QByteArray baTemp;
   QString sTemp;
   baTemp = proc1.readAllStandardOutput();
   sTemp = baTemp;
   ui->textEdit->setHtml(sTemp);
 
   }
}
Ядро:
Код
C++ (Qt)
#include <QCoreApplication>
#include <QFile>
#include <QIODevice>
#include <QTextStream>
#include <iostream>
#include "commandconst.h"
 
using namespace std;
 
int main(int argc, char *argv[])
{
//    QTextStream cout(stdout);
//    QTextStream cin(stdin);
   QString sTemp;
   bool bOk;
//    cout.setCodec("UTF-8");
//    cin.setCodec("UTF-8");
 
   QCoreApplication a(argc, argv);
   if (argc > 1)
   {
     cout << "Hello World!" << endl;
   }
 
   unsigned short uInputCommand;
 
   while (cin >> uInputCommand)
   {
//        cin >> sTemp;
//        uInputCommand = sTemp.toInt(&bOk, 10);
 
       switch (uInputCommand)
       {
       case EXIT_PROGRAM:
           cout << "Succesfully closed / Óñïåøíî çàêðûòî";
           return 0;
       case LOAD_FILE:
 
           QFile fHtmlFile("index.html");
           QString sText;
           if (!fHtmlFile.open(QIODevice::ReadOnly)) {
           cout << "Cannot open file for reading: ";
           }
           QTextStream tsHtmlFile(&fHtmlFile);
           tsHtmlFile.setCodec("UTF-8");
           sText = tsHtmlFile.readAll();
//            for (int i = 0; i < baText.count() - 1; i++)
//            cout << baText.at(i);
//            QByteArray baText;
//            baText.append(sText);
//            baText = baText.toBase64();
//            sText = baText;
           cout << sText;
           fHtmlFile.close();
       }
   }
 
   return a.exec();
}
Пробовал так  QTextStream cout(stdout);  и сжимать и кодировать в Base64 всё равно данные искажаются.
Можно ли такой обмен настроить или использовать QSharedMemory?

Благодарю за ответы!
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #1 : Июнь 18, 2015, 06:17 »

Что такое в Вашем понимании "искажения"? Левые данные, потеря данных, кракозябры? Вы под какой ОС запускаете? Может проблема с кодировкой? Попробуйте вывести то что отправили и то что получили как байт, например, toHex(), и сравните. Если байтики совпадают, значит все верно передает и где-то там что-то там с кодировкой. Хотя может вы уже пробовали это  Улыбающийся
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Июнь 18, 2015, 22:14 »

DBus в линукс, в винде не знаю работает или нет, так же локальные/сетевые сокеты это что из кроссплатформенного.
так же каждая ОС поддерживает свои IPC.
Записан
xwicked
Гость
« Ответ #3 : Июнь 18, 2015, 23:33 »

Спасибо за советы. Я проглядел, что у меня в стандартный вывод отправляется лишняя информация типа
Код
C++ (Qt)
cout << "Succesfully closed / Óñïåøíî çàêðûòî";
Когда к base64 приклеивался лишний текст, то он не мог правильно декодировать. Проверил всё на оффтопике, в линухе я думаю base64 будет так же нормально обрабатываться и этот способ будет кроссплатформенный.
P.S. Теперь я смогу свои программы более чётко разделить на основную и интерфейс, повысив производительность основной части программы. Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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