Seite 1 von 1
[gelöst] Kommunikation zwischen Vater- und Kindprozess
Verfasst: 7. September 2007 16:00
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...
Verfasst: 7. September 2007 16:16
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.
Verfasst: 7. September 2007 16:27
von Christian81
std::cout und std::cin in einem Qt-Programm? Schonmal versucht die
Qt-Doku zu lesen?
Verfasst: 7. September 2007 16:32
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?
Verfasst: 7. September 2007 17:37
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 ?
Verfasst: 7. September 2007 17:48
von Christian81
du benutzt ja gar nicht std:: - habe mich also umsonst aufgeregt
Kannst Du nicht auf QIODevice::readyRead () reagieren?
Verfasst: 7. September 2007 18:26
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!! 