C++で30ミリ秒経過後にループを終了する最良の方法は何ですか?
質問
C++ でできるだけ 30 ミリ秒近くでループを終了する最善の方法は何ですか。ポーリングブースト:microsec_lock ?ポーリング QTime ?他に何か?
何かのようなもの:
A = now;
for (blah; blah; blah) {
Blah();
if (now - A > 30000)
break;
}
Linux、OS X、Windows で動作するはずです。
ループ内の計算はシミュレーションを更新するためのものです。30 ミリ秒ごとにビューポートを更新したいと思います。
解決
かなりこのリンクでコードスニペットの例は、あなたが欲しいものを行います:
http://www.cplusplus.com/reference/clibrary/ctime/クロック/ の
その例から適応:
void runwait ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait)
{
/* Do stuff while waiting */
}
}
他のヒント
ループでの計算はするためのものです シミュレーションを更新。すべての30msの、私は思います ビューポートを更新したい。
あなたはスレッドを使用して考えがありますか?何を記述することで、スレッドの代わりにタイマーを使うべき理由の完璧な例だ。
メインプロセススレッドは、UIの世話を続け、QTimerはそれを更新するために30msに設定されています。これは、データへのアクセス権を持っている QMutex にロックし、更新を実行し、ミューテックスを解放します。
第二のスレッド(参照 QThread の)シミュレーションを行います。データは(UIの更新に適した)安定した状態にあるとき、サイクル毎に、それがQMutexをロックし、計算と解放ミューテックスを行います。
マルチコアプロセッサ上で増加傾向を使用すると、タイマーを使用してよりもスレッドを使用してのより多くを考える必要があります。あなたのアプリケーションは、自動的に新しいプロセッサの電力の増加(マルチコア)から利益ます。
、それが解決策で別の表情を与える可能性があります。どのような別のスレッドでシミュレーションコードとユーザーインターフェイスを置くことについてはどうですか?あなたはQtのを使用する場合は、定期的な更新はしても、タイマーや QThread :: msleepを用いて実現することができます( )の。あなたはを適応させることができマンデルブロの例では、あなたのニーズに合わせてを通さ。
短い答えはあります。
あなたは、Intelシステムや他のアーキテクチャ上の何か他のすべてのOSの使用してアセンブリの呼び出しにCLOSE 30ミリ秒まで取得することができます。私は、参照を掘ると、私はそれを見つけたときにコードを含めるように答えを編集します。
問題は、タイムスライシングアルゴリズムとどのようにあなたのタイムスライスの終わりに近いあなたはマルチタスクOSであるである。
は、いくつかのリアルタイムOS年代に、あなたが作ることができ、システムライブラリでシステムコールがありますが、私はその呼び出しがどうなるかわからない。
編集:LOL!時間を提供するために、タイマー機能:誰かがすでにSOに似スニペットを投稿しましたC ++ の
を使用してナノ秒VonCはそれでCPUタイマーアセンブリコードとのコメントを持っている。
によるご質問、30msいのビューポートです。書いた類似アプリケーションの探ハードウェアを毎500ms同様のもの。こんに直接お答えい、以下のfollowups:
- せていただきましたBlah()、更新、ビューポートで実行できます30ms以下の各インスタンス?
- されてきていることから動作しているようでBlah()が行われてしまうわけで良いタイマーによってコールバック.
- 重要なことだと思いライブラリオブジェクトタイマーと新しいパートナーシップを、30msの間隔を更新いグラフィカルな枠組みWindows XPすることを見いだし,その標準Win32APIイマーク画面メッセージタイマー間の期限であっても、2GHz、P4ないで更新よりも早く、300ms間、どんなに低い設定の時間間隔のタイマー.また高性能タイマーのWin32APIでは、多くの制約をとることができなIPC(更新UIウィジェット)のループのようなおしている。
- 基本的には、聞きプランもすいての更新が発生します。する必要がある糸を使用し、いかに更新したいのビューポートです。
うものを考えています。きれいに驚き合い始めて現状進める最後ます。だと思ったんこのものを通じて無視してください私の答え:0)です。
あなたは、ビューポートごとにNのシミュレーションステップではなく、すべてのKミリ秒の更新を検討するかもしれません。これは、(例えば)深刻な商用アプリであれば、あなたはおそらく、マルチスレッドのルートは他の場所で提案行きたいとしているが、(例えば)かどうかは、個人または制限され、視聴者の使用のためだとあなたが本当に興味を持っていますそれはあなたがシミュレートしているが何であれの詳細、そしてすべての-N-の手順は、シンプルなポータブルです、よくして乗ることには十分かもしれません。
を参照のQueryPerformanceCounterとQueryPerformanceFrequency
あなたはQtのを使用している場合は、ここではこれを行うための簡単な方法があります:
QTimer* t = new QTimer( parent ) ;
t->setInterval( 30 ) ; // in msec
t->setSingleShot( false ) ;
connect( t, SIGNAL( timeout() ), viewPort, SLOT( redraw() ) ) ;
あなたはviewPort
とredraw()
を指定する必要があります。その後t->start()
でタイマーを開始します。