à l'aide de QTextStream à lire stdin dans un non-blocage de la mode
À l'aide de Qt, je suis d'essayer de lire le contenu de l'entrée standard stdin flux dans un non-blocage de la mode. Je suis à l'aide de la QSocketNotifier pour m'avertir lorsque le socket a reçu quelques nouvelles données. Le programme d'installation pour le déclarant ressemble à ceci:
QSocketNotifier *pNot = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read, this);
connect(pNot, SIGNAL(activated(int)), this, SLOT(onData()));
pNot->setEnabled(true);
La onData()
fente 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 d'essayer d'utiliser l'appel système select() pour me dire quand je n'aurai plus de données à lire. Cependant, dans la pratique, ce qui se passe est l'appel select() renvoie la valeur 0 après j'ai lu la première ligne de texte. Ainsi, par exemple, si j'écris de 5 lignes de texte pour le processus de flux stdin, je n'ai jamais lu la première ligne.
Quel pourrait être le problème?
yup. Je crois qu'il utilise paître() en interne pour détecter le moment où il atteint la fin du flux. Le résultat est que, il bloque toujours.
ok, autre chose que je peux penser à essayer est la démolition de l'actuelle mise en œuvre (les sélectionner à l'appel) et de faire quelque chose de semblable à ce que le chef de choeur, voir outils\assistant\tools\assistant\remotecontrol*
Ce code fonctionne très bien lorsque je saisie directement dans le terminal. C'est assez pour moi... Merci. 😉
OriginalL'auteur Thomi | 2009-08-13
Vous devez vous connecter pour publier un commentaire.
Ligne de mise en mémoire tampon.
Par défaut est de rinçage après un "\n". Si vous écrire 5 lignes de vos processus, votre logement est appelé 5 fois. Si vous voulez éviter cela, vous devez appeler setbuf(stdin, _IOFBF). Mais même alors, il n'est pas garanti que vous pouvez lire arbitrairement grandes quantités de données en un seul morceau.
Edit: Il serait sans doute préférable d'utiliser QTextStream::paître (), au lieu de sélectionner, depuis QTextStream a ses propres tampons internes.
OriginalL'auteur Gunther Piez
J'ai trouvé l'exemple et dans d'autres réponse qui s'adapte à presque à cette question et avec complet et simple code:
https://stackoverflow.com/a/7389622/721929
Je l'ai utilisé pour mettre en œuvre un QT console application avec un texte de menu pour choisir la sélection de l'utilisateur.
OriginalL'auteur kikeenrique