2012-03-26 15 views
1

私はさまざまな種類のデータを同時に収集するために、複数のタイプのハードウェアを使用するアプリケーション(c++)に取り組んでいます。一般的な使用パターンは、それぞれの独自のスレッド内でそれぞれ異なるインターフェース(アイトラッキング、モーショントラッキング、ビジュアライゼーションなど)を実行することで、できるだけお互いを混乱させることです。私はスレッドが実際に実行されるときの超精密なタイミングを保証する必要はありません。ハードウェアタイマーが必要なことはわかっています。しかし、私が探しているのは、ある種の中央タイマーにスレッドが照会できるようにすることです。定期的に収集したデータにタイムスタンプを追加して、データを(半精度で)整列させることができます後で分析する。この目的のために、ミリ秒単位の精度が問題ありません。QElapsedTimerは複数のスレッドで収集されたデータを整列するためのスレッドセーフなタイミングですか?

アプリケーションではgui目的でQtが使用されていますので、QElapsedTimerは潜在的な解決策と考えています。ただし、すべてのメソッドはreentrantであり、スレッドセーフではありません。このタイプのタイミング機能を使用したい各スレッドに対して、これはユニークなQElapsedTimerオブジェクトを必要とすることを訂正していますか?これが当てはまる場合、私のアプローチは、各スレッドがブロッキング関数(メインスレッドで実行される)でタイミングを初期化するように要求することです。初期化には、タイマー+「メイン」タイマーからのオフセットを組み合わせたラッパー・オブジェクトを作成することが含まれるため、作成されたすべてのタイマーはメイン・タイマーに「同期」されます。これは、スレッドセーフではない元のタイマーからのオフセットを得るために、メインスレッドで行われる。

これは妥当なアプローチですか、代わりに使用するより優れた「標準」(設計パターン)アプローチですか?あるいは、私の目的に合った別の図書館がありますか?現在私はWindows(7とXP)で作業していますが、アプリケーションは最終的にクロスプラットフォームになる予定です。

答えて

2

Qtには、同期呼び出しを行うためのQMutexLockerなどの便利なクラスがあります。したがって、関数をスレッドセーフとしてマークするためにQMutexLockerをQMutexと共に使用することができます。そして、スレッド間で問題なくQElapsedTimerを使用できます。

+0

ありがとう...関数が呼び出されるたびにmutexをロックする必要を避ける方法を探していましたが、これが最善の方法かもしれません。私はこれを今のところ実装しています。このmutexedなやり方をするのがより高価であることがわかったら、私のオリジナルの提案に似たものに変更する必要があります。 – tmpearce

1

リエントラントとは、同時にアクセスしたい場合に、スレッドごとに少なくとも1つの異なるインスタンスが必要であることを意味します。 QDateTimeを使用してタイムスタンプを生成することもできますが、これはスレッドセーフではありません。したがって、そのメソッドへのアクセスをmutexする方が良いと思います。

関連する問題