Processus parent chaîne d'écriture Qt 4.7.3 P> Code de processus parent: P> "Message \ n" code> au processus d'enfant STDIN. Mais le processus enfant ne le reçoit pas. Où est le problème dans le code?
// class TestChild : public QMainWindow
void TestChild::TestChild()
// QFile TestChild::input;
connect( &input, SIGNAL( readyRead() ),
this, SLOT( readInput() ) );
input.open( 0, QIODevice::ReadOnly ); // stdin
}
void TestChild::readInput()
{
QString line;
line.append( '(' );
line.append( QString::number( input.bytesAvailable() ) )
line.append( ')' );
line.append( input.readAll() );
list.append( line ); // add line to QListView
}
3 Réponses :
Ce que je crois avoir besoin de faire est de lire à partir de l'objet QProcess actuel (dans ce cas, si je comprends correctement).
Notez que Qprocess est en réalité une sous-classe de QioDevice, et prend également une note particulière de la Fonctions suivantes: P>
QProcess::setReadChannel() QProcess::readAllStandardOutput()
Non. ChildProcess Code> est un objet de contrôle dans le processus parent. Utilisation de
ChildProcess Code> Processus d'objet Imprimer la chaîne d'impression sur
STDIN CODE> (
TESTPARENT :: WRITETOTECHILDPROCESSOUPUT () CODE>). Et le processus enfant doit lire cette chaîne de
stdin code>. Donc, dans le processus enfant
lisyyread () code> Signal de
entrée qfile code> doit être émis (mais il n'y a pas de
lectureyread () code> Signal émis,
TestChild :: ReadInput () CODE> Slot n'est pas appelé).
La documentation indique que Mais il y a une classe privée: Une autre alternative consiste à attendre l'entrée avec une boucle de blocage à l'intérieur d'un fil dédié: p> Vous pouvez également regarder d'autres méthodes RPC (par exemple, qfile code> n'émet pas jamais le signal
lectureyread () code>.
qwineventanifier code> dans
src / corelib / kernel / qwinevennotifier_p.h code> (link) qui pourrait fonctionner avec
getStdhandle (std_input_handle) code>. p>
Qlocalsocket code>,
qsharedmemory code>). P> p>
Merci, va essayer qwineventivement. Mais le problème existe toujours: j'ai toujours démarré une minuterie que chaque x ms écrit au journal de fichier entrée.bytesAvailable () code>, et il écrit toujours
0 code>. Est
bytesAvailable () code> utilisation ici aussi?
QsharedMemorory code> n'a pas essayé. Mais sur
qlocalsocket code>,
qlocaleerver code> (tuyau nommé dans Windows): je dois toujours échanger des noms de tuyaux (1 pour chaque
qlocalserver code>). Y a-t-il une autre méthode simple pour envoyer un nom de tuyau, autre que stdin / stdout?
1. Vous ne pouvez pas jeter un coup d'œil sur Stdin Buffer avec des bibliothèques standard C / C ++. Ce ne serait donc pas une surprise si Qt ne le permet pas non plus. 2. Vous pouvez envoyer le nom du tuyau comme des arguments de sous-processus.
Et que dois-je utiliser pour la communication des enfants-> parents? Toujours utiliser stdout?
"Vous pouvez ensuite écrire à l'entrée standard du processus en appelant écrire () et lisez la sortie standard en appelant lecture (), readline () et getchar ()." ( doc.qt.nokia.com/latest/qprocess.html )
Oui, vous pouvez utiliser stdout mais qlocalsocket peut être bidirectionnel afin de ne pas avoir mélanger les deux méthodes de communication. Le problème n'est pas que vous ne pouvez pas utiliser de lecture / écriture avec l'entrée / sortie standard du processus enfant, mais celle-ci () sur le côté du processus d'enfant, ne fonctionne pas pour STDIN. Vous devriez utiliser l'API native (par exemple ici ) sinon vous devez utiliser un Blocing b> lire l'appel.
Il n'y a aucun moyen de connecter de manière portante dans la boucle d'événement QT pour les événements STDIN / STDOUT. Les travaux suivants sur des plates-formes non-Windows: "0" est le descripteur de fichier (stdin). P> Je voudrais utiliser ce qui précède, puis simuler quelque chose de similaire sur Windows à travers un filetage de blocage qui lit de STDIN et génère un signal: p> puis, dans le processus enfant: p> StdinThread *t = new StdinThread(this);
connect(t, SIGNAL(incomingData(QByteArray)), this, SLOT(processInputData(QByteArray)));
connect(t, SIGNAL(finished()), this, SLOT(brokenInputChannel()));
t->run();
+1. C'est utile, merci. Vous ne savez pas si qprocess :: écrire code> (sdin piping) fonctionne sous Windows? À d'autres termes: puis-je écrire à STDIN de l'enfant?
Oui, vous pouvez. Windows prend en charge la tuyauterie. Faites attention à la mise en mémoire tampon.
Testchild est-il un QProcess? Et l'entrée est un QioDevice, pas une sous-classe?
@Chris: Non, TestChatd - Objet de la fenêtre principale du processus d'enfant. Dans le processus parent, nous créons un enfant à l'aide de
ChildProcess code> objet. Mon erreur:
entrée code> est qfile, merci.