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
Respuesta
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.
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.
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. –
@ericdescourtis Dado que esta respuesta tiene más de 5 años, ahora hay opciones mucho mejores. – Karlson
? Degnahc sah yltcaxe tahw ot sa su nethgilne uoy dluoC! TaerG –
Si está abierto a usar boost, puede usar la biblioteca de Asio. Un posix::stream_descriptor
asignado a STDIN_FILENO
funciona bastante bien. Vea también this answer.
Trate de usar QSocketNotifier
QSocketNotifier * notifier = new QSocketNotifier(FDSTDIN, QSocketNotifier::Read);
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int)));
Si desea integrar stdin/stdout/stderr de E/S con el evento de lazo QT, puede:
- Utilice un QSocketNotifier y hacer lo que/O usted mismo con
read(2)
ywrite(2)
, o - Obtenga un objeto
QFile
y llame albool QFile::open (int fd, OpenMode mode)
para hacer la E/S de estilo Qt con él.
- 1. ¿Lectura de stdin flush stdout?
- 2. lectura asíncrona stdout del subproceso.Popen
- 3. Lectura de datos binarios de stdin
- 4. clojure lein (línea de lectura) stdin woes
- 5. lectura asíncrona de contenido fragmentado con HttpClient de ASP.NET WebApi
- 6. boost :: asio, error de lectura asíncrona
- 7. ¿Es seguro ajustar NetworkStream con BufferedStream para lectura asíncrona?
- 8. Lectura línea por línea de STDIN sin bloqueo
- 9. línea de lectura por la línea de STDIN
- 10. Cómo cancelar la lectura/escritura asíncrona sin cerrar el socket?
- 11. Uso de STDIN con AllocConsole()
- 12. Reconociendo las teclas de flecha con stdin
- 13. problema de gdb con la redirección stdin
- 14. excepción de una operación de lectura asíncrona ya está en marcha en la corriente StandardOutput
- 15. Leer contraseña de stdin
- 16. ¿Buenas prácticas con STDIN en Ruby?
- 17. ¿Cómo leer desde stdin con fgets()?
- 18. Usando boost :: asio :: async_read con stdin?
- 19. Conexión asíncrona y desconexión con epoll (Linux)
- 20. Usar canalizaciones con nombre de manera asíncrona con StreamWriter
- 21. strcmp en una línea de lectura con fgets
- 22. ¿Usando Qt con DirectX?
- 23. Cmake con Qt Creator
- 24. QT: problema con qobject_cast
- 25. fecha setLastModified con Qt
- 26. Eclipse integra con qt
- 27. servicio WCF con Qt?
- 28. Serialización con Qt
- 29. Uso de SQLite con Qt
- 30. Puntas de globo con Qt
¿Qué hay de malo con el uso de un hilo o un sondeo? – Chris
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
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