2009-02-22 42 views
2

我們正在嘗試從連接到Linux盒的2個USB鼠標讀取數據(該數據用於在機器人上進行測距/定位)。所以我們需要不斷從每隻鼠標讀取它的移動量。問題是,當鼠標沒有移動時,它不會發送任何數據,所以我們從中獲取數據塊的文件流以及程序無法進行odometry計算(這涉及時間測量的速度) 。在C++中設置ifstream超時?

是否有一種方法可以在輸入流上設置超時(我們在C++中使用ifstream並從/ dev/input/mouse讀取),以便我們能夠知道鼠標何時不移動,而不是等待一個事件被接收?或者我們需要搞砸線程(arggh ...)?歡迎任何其他建議!

提前致謝!

回答

-1

不,沒有這樣的方法。你將不得不等待一個事件,或者創建一個自定義的Timer類,並等待超時重置或使用線程。

1

你正在尋找的是一個異步的方式來讀取ifstream,如套接字通信。唯一可以幫助的是readsome函數,如果沒有數據可用,它可能會返回,但我懷疑這有助於。

使用線程將是處理此問題的最佳方法。

5

在linux中讀取多個文件描述符的常用方法是使用select()。我建議從manpage開始。基本系統流程如下:

1)初始化裝置
2)獲取設備的文件描述符列表
3)設置超時
4)呼叫與文件描述符和超時作爲參數選擇 - 它會直到在其中一個文件描述符上有數據或達到超時爲止
5)確定爲什麼選擇返回並相應地採取行動(即在具有數據的文件描述符上調用read())。您可能需要在內部緩衝讀取結果,直到獲得完整的數據文件。
6)循環回到4.

這可以成爲你的程序主循環。如果你已經有了一個不同的主循環,你可以在沒有循環的情況下運行上面的代碼,但是你需要確保函數的調用頻率足夠高,這樣你就不會丟失串口上的數據。您還應該確保您的更新速率(即1 /超時)對於您的主要任務而言足夠快。

Select可以對任何文件描述符進行操作,例如網絡套接字和通過文件描述符公開接口的任何其他文件描述符。

+0

+1,select()是要走的路,因爲它避免了多線程引起的頭痛。 – 2009-02-22 16:38:16