[gelöst] Kommunikation zwischen Vater- und Kindprozess

Alles rund um die Programmierung mit Qt
Antworten
m0le
Beiträge: 11
Registriert: 7. September 2007 15:51

[gelöst] Kommunikation zwischen Vater- und Kindprozess

Beitrag von m0le »

Ich habe folgende Situation:
Aus einem Prozess (nennen wir ihn mal Vater) heraus starte ich einen 2. (nennen wir ihn Kind) als QProcess.
Jetzt möchte ich, dass Vater und Kind miteinander reden können, dies funktioniert auch, allerdings nur für Strings, dh. ich arbeite mit folgenden Funktionen:

Auf Vaterseite: vater.write() und vater.read()
Auf Kindseite: std::cout und std::cin

Jetzt möchte ich allerdings auch andere Datentypen übertragen können (in meinem Fall z.B. double-Werte und eine Stringlist).

Mein Ansatz sah so aus, dass ich die Daten über einen QDataStream übertrage, dies hat bei mir aber nicht funktioniert.
Daher wollte ich fragen, ob hier jemand sowas in die Richtung schonmal gemacht hat und mir da evtl. weiterhelfen kann...
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

du wandelst einfach die daten um?
und machst vllt datenpakete oder so?
zb für double

QString("double:" + QString::number(variable));

oder per QVariant, den du dann in den gebrauchten Typ umwandelst, bzw als
char schickst.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

std::cout und std::cin in einem Qt-Programm? Schonmal versucht die Qt-Doku zu lesen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Mein Ansatz sah so aus, dass ich die Daten über einen QDataStream übertrage, dies hat bei mir aber nicht funktioniert.
Tolle Fehlermeldung... Gehts auch genauer?
m0le
Beiträge: 11
Registriert: 7. September 2007 15:51

Beitrag von m0le »

Ok, hier die genauere Erklärung:

Auf Vaterseite würde das so aussehn:
QProcess child;
child.open ("child.exe");
QDataStream stream(&child);

double d=1.11;

stream<<d;

...

Auf Kindseite:
QFile inFile;
inFile.open(stdin,QIODevice::ReadOnly);
QDataStream inStream(&inFile);

double d;
inFile.waitForReadyRead(-1);
inStream>>d;

Das Problem dabei ist, dass waitForReadyRead nicht blockiert sondern einfach weiterläuft, daher stehen die Daten zum Lesezeitpunkt noch nicht bereit und in d steht hinterher 0 oder ein Zufallswert.

std::cout und std::cin in einem Qt-Programm? Schonmal versucht die Qt-Doku zu lesen?
Die Doku hab ich schon gelesen, nur hilft mir für den Kindprozess QProcess nicht weiter, da der Kindprozess ja gar nicht weiß, dass er von einem anderen Prozess aufgerufen wird.

Gibt es einen andere, Qt-spezifische, Variante um auf stdin/stdout zuzugreifen als cout/cin bzw. printf/scanf ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

du benutzt ja gar nicht std:: - habe mich also umsonst aufgeregt :)

Kannst Du nicht auf QIODevice::readyRead () reagieren?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
m0le
Beiträge: 11
Registriert: 7. September 2007 15:51

Beitrag von m0le »

Was ich vorher geschrieben hab ist die Variante, die ich gerne hätte, und dien nicht richtig funktioniert.

Was funktioniert, aber eben nur mit Strings ist folgendes:

Vater:
child.write("Hello World");

Kind:
char temp[24];
std::cin>>temp;

Also doch mit std::, wo genau liegt denn da dein Problem bzw. was ist "böse" daran?
Kannst Du nicht auf QIODevice::readyRead () reagieren?
Das hab ich gerade mal versucht und scheinbar wird dieses Signal nie ausgesendet, zumindest läuft dieses Programm unendlich lange:

Code: Alles auswählen

stdinInterface::
stdinInterface(QObject * parent) : QObject(parent)
{
    m_inFile.open(stdin,QIODevice::ReadOnly);
	m_inStream.setDevice(&m_inFile);
	connect(&m_inFile,SIGNAL(readyRead()),this,SLOT(readyRead()));
    m_readyFlag=false;
}


void 
stdinInterface::
doit (void)
{
  //while(true)
  {        
    
      QFile logfile("doitLog.txt");
	  logfile.open(QIODevice::WriteOnly);
      QTextStream log(&logfile);
	  if(!m_inFile.reset())
		  return ;
      
      while(!m_readyFlag)
      {
        log<<"Waiting\n";
      }
      QString s;
      m_inStream>>s;
      log<<"Daten empfangen "<<s<<"\n"; 
  }  
}

void 
stdinInterface::
readyRead(void)
{
    m_readyFlag=true;
}

Edit:
Ich habe es jetzt etwas anders realisiert:

Ich schreibe meine Daten mit einem QDataStream in ein QByteArray.
Dieses wird dann Base64-encodiert und über die ganz normalen Schnittstellen als String übertragen.

D.h. auf Vaterseite: child.write() bzw. child.readAll();
auf Kindseite: std::cin bzw. std::cout


--> Erledigt!! :D
Antworten