Utilizzando Qt, sto tentando di leggere il contenuto dello stdin stream in modo non bloccante. Sto usando QSocketNotifier per avvisarmi quando il socket ha ricevuto alcuni nuovi dati. L'impostazione per il notificante è simile al seguente:utilizzando QTextStream per leggere lo stdin in modo non bloccante
QSocketNotifier *pNot = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read, this);
connect(pNot, SIGNAL(activated(int)), this, SLOT(onData()));
pNot->setEnabled(true);
Lo slot onData()
assomiglia a questo:
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;
}
Come potete vedere sto cercando di utilizzare la chiamata di sistema select() per dirmi quando Ho esaurito i dati da leggere. Tuttavia, in pratica, ciò che sta accadendo è che la chiamata select() restituisce 0 dopo aver letto la prima riga di testo. Ad esempio, se scrivo 5 righe di testo nello stream stdin del processo, ho sempre letto solo la prima riga.
Quale potrebbe essere il problema?
hai provato readAll invece di readLine? – Bob
sì. Penso che usi atEnd() internamente per rilevare quando viene raggiunta la fine del flusso. Il risultato è che blocca per sempre. – Thomi
ok, solo l'altra cosa che posso pensare di provare è rottamare l'implementazione corrente (la chiamata selezionata) e fare qualcosa di simile a ciò che fa l'assistente, vedere strumenti \ assistente \ strumenti \ assistente \ remotecontrol * – Bob