Mit Qt zu lesen, ich bin versucht, den Inhalt des stdin-Stream in einer nicht-blockierenden Art und Weise zu lesen. Ich verwende den QSocketNotifier, um mich zu benachrichtigen, wenn der Socket einige neue Daten empfangen hat. Das Setup für den Anmelder sieht wie folgt aus:QTextStream mit stdin in einer nicht blockierenden Art und Weise
QSocketNotifier *pNot = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read, this);
connect(pNot, SIGNAL(activated(int)), this, SLOT(onData()));
pNot->setEnabled(true);
Der onData()
Schlitz wie folgt aussieht:
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;
}
Wie man sehen kann ich versuchen, die select() Systemaufruf zu verwenden, um mir zu sagen, wenn Ich habe keine Daten mehr zum Lesen. In der Praxis passiert es jedoch, dass der Aufruf von select() 0 zurückgibt, nachdem ich die erste Textzeile gelesen habe. Wenn ich zum Beispiel 5 Zeilen Text in den stdin-Stream des Prozesses schreibe, lese ich immer nur die erste Zeile.
Was könnte das Problem sein?
haben Sie ReadAll statt readline versucht? – Bob
yup. Ich denke, es verwendet atEnd() intern, um zu erkennen, wann es das Ende des Streams erreicht hat. Das Ergebnis ist, dass es für immer blockiert. – Thomi
ok, nur andere Sache, die ich versuche, denken kann, ist die aktuelle Implementierung Verschrottung (der select-Aufruf) und ähnlich, etwas zu tun, was der Assistent nicht finden Tools \ Assistent \ Tools \ Assistent \ Klappschlüssel * – Bob