à 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?

avez-vous essayé readAll au lieu de readLine?
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