2009-07-13 9 views
2

Hej!周期約100msのポータブル周期タイマ

私はC++プロジェクトでタスクを定期的にディスパッチするポータブルな方法を探しています。この特定のプロジェクトでは、ブーストなどのライブラリの使用は避けるべきです。

解像度の要件はそれほど深刻ではありません:平均的なネットブックで5Hzから20Hzです。

このプロジェクトでは、OpenGLを使用してHMIをレンダリングしていますが、私はバックエンドの部分で作業しているため、あまり慣れていません。

おかげで、あなた何かアドバイスや提案、 アルネ

EDIT:何私たちの「タスク」クラスが実際には、Linux用の窓やのpthread_create(..)のためのCreateThread(..)のいずれかを使用してスレッドを作成しています。

+0

事前にターゲットプラットフォームが分かっていますか? – sharptooth

+0

もちろん:windows xpとlinux、おそらくubuntu – Arne

+0

@Arneあなたの質問の最後に[EDIT]マークをつけておき、後であなたのコメントを削除してください。 –

答えて

1

これを達成する最も簡単な方法は、スリープ(100ms)を1サイクルで使用することです。ポータブルスリープが必要です。 Linuxの場合、次のように実装できます。

void Sleep(unsigned long ulMilliseconds) 
{ 
    struct timeval timeout; 
    timeout.tv_sec = 0; 
    timeout.tv_usec = ulMilliseconds * 1000; 
    select(1, NULL, NULL, NULL, &timeout); 
} 
0

よく、私はGlibmm/sigc++のようなこの種のものを含む多くのライブラリを見つけることができると思うが、それはあなたの爪のために大きすぎるハンマーだと思う。あなたがすでにライブラリーを持っていると思うので、ポータブルマルチスレッドと定期的なタイマーが含まれていない場合は、自分で簡単に行うことができます。タイミング要件が低い場合は、スリープ状態になる無限ループを実行するスレッドを開始し、起床時にコールバックメソッドを呼び出します。軽量なので、sigc++を使用してコールバックを処理できます。スレッドなどがなく、ブーストを使用したくない場合は、Glibmmを試してみてください。あなたが後押しをしたくない場合は私はあなたがすでにターゲット・システムの完全なセットを知っているので、あなたがSQLiteの道を行くことができるような大きなライブラリでもない

my2cents. 
1

:-)あなたが望んでいないだろうと仮定します。彼らはまったく同じ問題を抱えています - 彼らが使う多くのものはシステム依存です。

システムに依存するすべてのものは、ターゲットシステムごとに個別に実装され、正しいバージョンはプリプロセッサディレクティブセットに応じてコンパイルされます。

+0

ありがとうございます。確かに、現時点で何が起こっているのかを#defineで制御しています。 私が探しているのは、両方のターゲットシステムでスレッドの期間を設定できるようにする「隠された」APIのようなものです。私は自分のソリューションを強制的にロールアウトしてしまうのではないかと恐れています... – Arne

+0

非常にポータブルな方法、確かに... –

+0

"隠された"とはどういう意味ですか? – sharptooth

1

定期的なトリガーを使用する場合は、ループ内で100msの間スリープするスレッドがそのトリックを行う可能性があります。

関連する問題