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...
[gelöst] Kommunikation zwischen Vater- und Kindprozess
-
CaptnChaos
- Beiträge: 605
- Registriert: 28. Juni 2007 15:01
- Kontaktdaten:
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
std::cout und std::cin in einem Qt-Programm? Schonmal versucht die Qt-Doku zu lesen?
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
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.
Gibt es einen andere, Qt-spezifische, Variante um auf stdin/stdout zuzugreifen als cout/cin bzw. printf/scanf ?
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.
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.std::cout und std::cin in einem Qt-Programm? Schonmal versucht die Qt-Doku zu lesen?
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:
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?
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!!
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?
Das hab ich gerade mal versucht und scheinbar wird dieses Signal nie ausgesendet, zumindest läuft dieses Programm unendlich lange:Kannst Du nicht auf QIODevice::readyRead () reagieren?
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!!