標準輸入異步讀取我想從使用Qt標準輸入異步讀取。我不想使用單獨的線程或必須設置定時器來定期檢查文件描述符是否有數據。我怎樣才能做到這一點?從使用Qt
從使用Qt
回答
如果你閱讀Qt文檔,它說你不能這樣做,因爲它不可移植。爲什麼不使用一個TCP套接字,它應該可以工作,假設你可以控制另一端。最糟糕的情況是你可以創建一個代理應用程序。
正如克里斯指出的最好方法是將有一個單獨的線程會從stdin
輪詢並填充用於顯示或處理線程來處理數據。
現在你肯定可以設置QTimer
併爲timeout()
信號設置處理程序,以便從stdin
中讀取。實施的方法完全取決於你。
而對於第二種方法,你可以看看QT's timer class documentation關於如何做到這一點的例子。需要記住的一件事就是在處理完成後實際重啓計時器。
這聽起來像一個好主意,直到你看到手機和筆記本電腦對電池壽命的影響。更何況你引入了一個人爲的延遲,使你的應用程序顯得呆滯。 – 2017-09-26 19:54:13
@ericdescourtis鑑於這個答案已經超過5年了,現在有更好的選擇。 – Karlson 2017-09-26 20:15:37
?degnahc SAH yltcaxe tahw OT週六週日nethgilne uoy dluoC!taerG – 2017-09-27 14:05:36
如果你是開放的使用升壓,你可以使用短耳庫。 A posix::stream_descriptor
分配給STDIN_FILENO
工作得很好。另見this answer。
嘗試使用在QSocketNotifier
QSocketNotifier * notifier = new QSocketNotifier(FDSTDIN, QSocketNotifier::Read);
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int)));
如果你想標準輸入/輸出/標準錯誤I/O與QT事件循環,您可以整合:
- 使用QSocketNotifier,做我/ O你自己
read(2)
和write(2)
或 - 得到一個
QFile
對象,並調用bool QFile::open (int fd, OpenMode mode)
做它的Qt風格的I/O。
- 1. 在Qt中使用組框使用Qt
- 2. 使用QProcess從Qt調用matlab函數
- 3. QT:何時使用QT :: keyRelease
- 4. 從Qt Creator中使用Qt標準圖標
- 5. 使用Qt中
- 6. Qt C++使用
- 7. 使用Qt
- 8. 使用Qt ItemDelegate
- 9. 使用QT
- 10. 使用Qt
- 11. 使用Qt
- 12. 使用Qt
- 13. QT使用addToJavaScriptWindowObject()
- 14. 使用memcpy使用Qt 4.8
- 15. 使用Hadoop使用Qt
- 16. 在Qt Creator中使用靜態Qt?
- 17. 下載使用Qt
- 18. 通過使用Qt
- 19. 使用Qt 5.0.1 MSVC2010
- 20. 使用Qt的OpenGL
- 21. 通過使用Qt
- 22. 如何使用Qt
- 23. 使用OpenGL和Qt
- 24. Eclipse中使用Qt
- 25. 使用SFML和Qt
- 26. Qt-creator使用dll
- 27. 使用QT/Symbian的
- 28. Qt的使用QSerialPort
- 29. 如何使用Qt
- 30. 製作使用Qt
有什麼不對使用線程或輪詢? – Chris 2012-03-16 16:56:30
不想浪費額外線程上的資源,必須處理鎖定,如果我可以避免它。當我的應用閒置時,我也不想浪費CPU週期。 – megazord 2012-03-16 17:10:49
聽起來像你想在優化你的代碼之前看看它是否真的需要。我想說線程的方法可能太複雜,但定期輪詢定時器相當便宜。 – Chris 2012-03-16 18:53:06