2012-03-26 22 views
1

我正在研究一個應用程序(c++),它利用多種類型的硬件同時收集各種類型的數據。常見的使用模式是在各自的線程中運行與這些設備的不同接口(眼動追蹤,動作追蹤,可視化等),以便儘可能少地彼此混淆。我不需要保證線程實際執行時的超精確定時,我知道這需要硬件定時器。但是,我期望做的事情是讓線程能夠查詢某種中央定時器,他們可以定期使用這些中央定時器爲收集的數據添加時間戳,以便數據可以(半精確)對齊稍後進行分析。毫秒級的精度對此很好。線程安全的時機來校準多線程中收集的數據 - QElapsedTimer的工作?

該應用程序使用Qt爲gui的目的,所以我認爲QElapsedTimer將是一個潛在的解決方案。但是,文檔聲明所有方法都是reentrant,而不是線程安全的。我是否正確,這需要一個獨特的QElapsedTimer對象爲每個希望使用這種類型的定時功能的線程?如果是這種情況,我的方法是要求每個線程在阻塞函數中初始化時間(在主線程中執行)。初始化將涉及創建一個包裝對象,它包含一個定時器+來自「主」定時器的偏移量,以便創建的任何/所有定時器都與主定時器「同步」。這將在主線程中完成,以獲得非線程安全原始計時器的偏移量。

這是一個合理的方法,還是有更好的「標準」(設計模式)方法,我應該使用呢?或者,有沒有更適合我的目的的不同的圖書館?目前我正在開發Windows(7和XP),但應用程序最終將被視爲跨平臺。

回答

2

在Qt中,您有方便的類,例如用於進行同步調用的QMutexLocker。因此,您可以使用QMutexLocker和QMutex以將該函數標記爲線程安全,然後您可以跨線程使用QElapsedTimer而不會有任何問題。

+0

謝謝...正在尋找一種方法來避免每次調用函數時都需要鎖定互斥鎖,但這可能是最好的方法。我現在正在以這種方式實施它,如果證明使用這種互斥方式更昂貴,我可能需要改變類似於我原來的建議。 – tmpearce 2012-03-27 15:14:30

1

可重入意味着如果您想同時訪問,您需要爲每個線程至少有一個不同的實例。您也可以使用QDateTime來生成時間戳,但這也不是線程安全的。因此,我認爲最好是對該方法的訪問進行互斥。