2012-03-16 10 views
9

Me gustaría leer asincrónicamente de stdin con Qt. No quiero usar un hilo separado o tengo que configurar un temporizador para verificar periódicamente si el descriptor de archivo tiene datos. ¿Cómo puedo hacer esto?Lectura asíncrona de stdin con Qt

+0

¿Qué hay de malo con el uso de un hilo o un sondeo? – Chris

+0

No quiero desperdiciar recursos en el hilo adicional y tengo que lidiar con el bloqueo no si puedo evitarlo. Tampoco quiero perder ciclos de CPU cuando mi aplicación está inactiva. – megazord

+2

Me parece que está tratando de optimizar su código antes de ver si realmente debe o no serlo. Yo diría que el enfoque del hilo probablemente sea demasiado complejo, pero sondear con frecuencia periódicamente con un temporizador. – Chris

Respuesta

3

Si lee la documentación de Qt, dice que no puede hacerlo porque no es portátil. ¿Por qué no utilizar un socket TCP que debería funcionar suponiendo que tiene control sobre el otro extremo? En el peor de los casos, puede crear una aplicación de proxy.

1

Como Chris señaló que la mejor manera sería tener un hilo separado que sondearía el stdin y rellenaría los datos de la visualización o del subproceso de procesamiento.

Ahora puede configurar sin problemas QTimer y configurar un controlador para la señal timeout() para leer desde stdin también. El método de implementación depende completamente de usted.

Y para el segundo método, puede echar un vistazo a QT's timer class documentation para ver un ejemplo de cómo hacerlo. Una cosa para recordar sería reiniciar el temporizador una vez que se complete su procesamiento.

+0

Esto suena como una buena idea hasta que vea el impacto en la duración de la batería para móviles y computadoras portátiles. Sin mencionar que introduces una latencia artificial que hace que tu aplicación parezca lenta. –

+0

@ericdescourtis Dado que esta respuesta tiene más de 5 años, ahora hay opciones mucho mejores. – Karlson

+0

? Degnahc sah yltcaxe tahw ot sa su nethgilne uoy dluoC! TaerG –

1

Trate de usar QSocketNotifier

QSocketNotifier * notifier = new QSocketNotifier(FDSTDIN, QSocketNotifier::Read); 
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int))); 
+0

¿Lo intentó? ¿Realmente funciona? – megazord

+0

No lo probé, encontré esta solución en algún lugar –

+1

Lo intenté. Desafortunadamente no: ((http://pastebin.com/8yWyMmsx – borisbn