En utilisant Qt, j'essaie de lire le contenu du flux stdin d'une manière non bloquante. J'utilise le QSocketNotifier pour m'avertir quand le socket a reçu de nouvelles données. La configuration du notificateur ressemble à ceci:en utilisant QTextStream pour lire stdin de manière non bloquante
QSocketNotifier *pNot = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read, this);
connect(pNot, SIGNAL(activated(int)), this, SLOT(onData()));
pNot->setEnabled(true);
L'emplacement onData()
ressemble à ceci:
void CIPCListener::onData()
{
qDebug() << Q_FUNC_INFO;
QTextStream stream(stdin, QIODevice::ReadOnly);
QString str;
forever
{
fd_set stdinfd;
FD_ZERO(&stdinfd);
FD_SET(STDIN_FILENO, &stdinfd);
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
int ready = select(1, &stdinfd, NULL, NULL, &tv);
if(ready > 0)
{
str += stream.readLine();
}
else
{
break;
}
}
qDebug() << "Recieved data:" << str;
}
Comme vous pouvez le voir, je suis tenté d'utiliser l'appel système select() pour me dire quand Je n'ai plus de données à lire. Cependant, en pratique, ce qui se passe est que l'appel select() renvoie 0 après avoir lu la première ligne de texte. Ainsi, par exemple, si j'écris 5 lignes de texte dans le flux stdin du processus, je ne lis jamais que la première ligne.
Quel pourrait être le problème?
Avez-vous essayé readAll au lieu de readLine? – Bob
yup. Je pense qu'il utilise en interne atEnd() pour détecter quand il a atteint la fin du flux. Le résultat est qu'il bloque pour toujours. – Thomi
ok, seulement une autre chose que je peux penser essayer est de mettre au rebut l'implémentation actuelle (l'appel select) et de faire quelque chose similaire à ce que fait l'assistant, voir tools \ assistant \ tools \ assistant \ remotecontrol – Bob