2012-03-16 74 views
9

標準輸入異步讀取我想從使用Qt標準輸入異步讀取。我不想使用單獨的線程或必須設置定時器來定期檢查文件描述符是否有數據。我怎樣才能做到這一點?從使用Qt

+0

有什麼不對使用線程或輪詢? – Chris 2012-03-16 16:56:30

+0

不想浪費額外線程上的資源,必須處理鎖定,如果我可以避免它。當我的應用閒置時,我也不想浪費CPU週期。 – megazord 2012-03-16 17:10:49

+2

聽起來像你想在優化你的代碼之前看看它是否真的需要。我想說線程的方法可能太複雜,但定期輪詢定時器相當便宜。 – Chris 2012-03-16 18:53:06

回答

3

如果你閱讀Qt文檔,它說你不能這樣做,因爲它不可移植。爲什麼不使用一個TCP套接字,它應該可以工作,假設你可以控制另一端。最糟糕的情況是你可以創建一個代理應用程序。

1

正如克里斯指出的最好方法是將有一個單獨的線程會從stdin輪詢並填充用於顯示或處理線程來處理數據。

現在你肯定可以設置QTimer併爲timeout()信號設置處理程序,以便從stdin中讀取。實施的方法完全取決於你。

而對於第二種方法,你可以看看QT's timer class documentation關於如何做到這一點的例子。需要記住的一件事就是在處理完成後實際重啓計時器。

+0

這聽起來像一個好主意,直​​到你看到手機和筆記本電腦對電池壽命的影響。更何況你引入了一個人爲的延遲,使你的應用程序顯得呆滯。 – 2017-09-26 19:54:13

+0

@ericdescourtis鑑於這個答案已經超過5年了,現在有更好的選擇。 – Karlson 2017-09-26 20:15:37

+0

?degnahc SAH yltcaxe tahw OT週六週日nethgilne uoy dluoC!taerG – 2017-09-27 14:05:36

1

嘗試使用在QSocketNotifier

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

你嘗試了嗎?它實際上工作嗎? – megazord 2012-03-26 21:57:37

+0

我沒試過,發現這個解決方案somwhere – 2012-03-27 13:00:29

+1

我試過了。不幸的是它沒有:((http://pastebin.com/8yWyMmsx – borisbn 2012-08-23 11:02:06